如文档中所示,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 (:)更方便。
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
2条答案
按热度按时间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(:)
更方便。1qczuiv02#
应采取以下措施:
字符串
scatter3
需要向量,而不是矩阵,据我所知here这是我的结果:x1c 0d1x
如果你想使用
meshgrid
而不对矩阵进行整形,你必须使用plot3
和'o'
符号。所以你可以得到类似的结果:型
编辑:
与这篇文章相关的一个问题是,以下哪种方法在计算速度方面更有效:我建议的函数
reshape(X,[],1)
,还是@Argyll建议的更简单的冒号版本X(:)。在对
reshape
函数和:
方法进行计时之后,我不得不承认后者更有效。我添加了我的结果和我用来计时两个函数的代码:
的
型