在matlab中绘制来自循环的scatter3和surf图

时间:2015-02-23 02:54:00

标签: matlab

我想从循环中绘制scatter3surf图。下面是我的代码,但它不起作用......不确定我出错的地方但显然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)

1 个答案:

答案 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);

我们在开头为xy生成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之间,则会发生这种情况。