“scatter3”需要Matlab中的向量

9jyewag0  于 6个月前  发布在  Matlab
关注(0)|答案(2)|浏览(81)
[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
scatter3(X,Y,Z)

字符串
使用scatter3时出错(第64行)X、Y和Z必须是相同长度的向量。
Matlab R2018b windows x64

p1tboqfb

p1tboqfb1#

如文档中所示,X,Y,Z必须是向量。(当你从Google上输入一篇关于mathworks的文章时,比如“matlab scatter3“,你会首先看到函数的语法。蓝色文本意味着超链接。所有输入都链接到页面底部,在那里定义了它们的确切类型。)
原因(大概)如下。
如文档中所述,scatter3将圆(或您选择的其他符号,如果您修改图形对象)放置在您选择的3D坐标上。坐标分别是X,Y,Z的第 i 个元素。例如,您希望在3D中绘制的第10个点的 x 坐标是X(10)
如果你知道X(i),Y(i),Z(i)确实是你想为所有 i 绘制的坐标,即使你的X,Y,Z出于某种原因不是向量,你需要重塑X,Y,Z。
为了重塑,你可以简单地做scatter3(X(:), Y(:), Z(:)),它告诉Matlab将数组读取为向量。(你应该查找这是以什么顺序完成的。但它是以**直观的方式。)或者你可以使用reshape。机会是:reshape对于大数据集更快。但ofc (:)更方便。

1qczuiv0

1qczuiv02#

应采取以下措施:

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;

X = X(:);
Y = Y(:);
Z = Z(:);

scatter3(X,Y,Z)

字符串
scatter3需要向量,而不是矩阵,据我所知here
这是我的结果:x1c 0d1x
如果你想使用meshgrid而不对矩阵进行整形,你必须使用plot3'o'符号。所以你可以得到类似的结果:

plot3(X,Y,Z,'o')


编辑:
与这篇文章相关的一个问题是,以下哪种方法在计算速度方面更有效:我建议的函数reshape(X,[],1),还是@Argyll建议的更简单的冒号版本X(:)。
在对reshape函数和:方法进行计时之后,我不得不承认后者更有效。
我添加了我的结果和我用来计时两个函数的代码:


sizes = linspace(100,10000,100);

time_reshape = [];
time_col = [];

for i=1:length(sizes)
    X = rand(sizes(i));             % Create random squared matrix

    r = @() ResFcn(X);              
    c = @() ColFcn(X);

    time_reshape = [time_reshape timeit(r)/1000]   % Take average of 1000 measurements
    time_col = [time_col timeit(c)/1000]       % Take average of 1000 measurements
end

figure()
hold on
grid on
plot(sizes(2:end), time_col(2:end))
plot(sizes(2:end), time_reshape(2:end))
legend("Colon","Reshape","Location","northwest")
title("Comparison: Reshape vs. Colon Method")
xlabel("Length of squared matrix")
ylabel("Average execution time [s]")
hold off

function res = ResFcn(X)
    for i = 1:1000    % Repeat 1000 times 
        res = reshape(X,[],1);
    end
end

function res = ColFcn(X)
    for i = 1:1000    % Repeat 1000 times 
        res = X(:);
    end
end

相关问题