我想从循环中绘制scatter3
和surf
图。下面是我的代码,但它不起作用......不确定我出错的地方但显然z
矩阵有问题吗?
for e = 1:10;
x = rand(1,3);
y = rand(1,3);
A = x+y;
subplot(2,2,1)
p = find(A(:,1) > 1.1 & A(:,1) < 1.6);
Result = A(p,:);
scatter3(Result(:,1), Result(:,2), Result(:,3))
hold on
z(e,:) = [Result(1) Result(2) Result(3)];
end
subplot(2,2,2)
surf(z)
答案 0 :(得分:1)
我将重申我在评论中所说的内容。尝试运行代码时出现此错误消息:Attempted to access Result(1); index out of bounds because numel(Result)=0
。这是因为您的p
条件不满意 - MATLAB在第一列中找不到1.1到1.6之间的任何元素。
因此,我建议你做的是在尝试访问值本身之前检查Result
是否为空。但是,我建议你不要写一个循环并立即生成所有随机值,然后用布尔条件进行过滤。因此,不使用循环的等效代码将是:
x = rand(10,3);
y = rand(10,3);
A = x+y;
p = A(:,1) > 1.1 & A(:,1) < 1.6;
z = A(p,:);
figure;
subplot(2,1,1);
scatter3(z(:,1), z(:,2), z(:,3));
subplot(2,1,2);
surf(z);
我们在开头为x
和y
生成10个3D点,然后添加这些点并将其存储到A
中。接下来,我们在A
中找到第一列中1.1到1.6之间的行,并将其存储为logical
数组。然后,我们使用此数组索引A
并将结果存储到z
。如果要将某些元素提取到数组中而不是使用find
,则建议使用此方法。
获得z
后,我们使用scatter
绘制这些点,然后找到同一矩阵的surf
表面图。顺便说一句,我已经修复了你的subplot
,因为你只创建了两个图,但你正在为4个图分配空间。
如果您完全倾向于使用代码,那么您只需执行此操作:
z = []; %// Change
for e = 1:10
x = rand(1,3);
y = rand(1,3);
A = x+y;
subplot(2,1,1)
p = find(A(:,1) > 1.1 & A(:,1) < 1.6);
Result = A(p,:);
scatter3(Result(:,1), Result(:,2), Result(:,3))
hold on
if ~isempty(Result) %// Change here
z = [z; Result(1) Result(2) Result(3)]; %// Change
end
end
subplot(2,1,2)
surf(z)
重要的是z
的初始化。我将其设为空,我们只添加z
,如果Result
不为空 - 如果生成的数字不在1.1和1.6之间,则会发生这种情况。