Matlab:在没有循环的情况下在单元阵列中绘制不相等的矩阵

时间:2017-05-24 21:53:13

标签: matlab matrix matlab-figure

知道:

关于在单元阵列中绘制相同大小的矩阵有很多讨论,没有循环就很容易做到。

例如,在mycell中绘制2×2矩阵:

mycell = {[1 1; 2 1], [1 1; 3 1], [1 1; 4 1]};

我们可以使用cellfun在每个矩阵的底部添加一行NaN,然后将单元格转换为矩阵:

mycellnaned = cellfun(@(x) {[x;nan(1,2)]}, mycell);
mymat = cell2mat(mycellnaned');

mymat看起来像:

     1   1   1   1   1 
     2   1   3   1   4 
    NaN NaN NaN NaN NaN

然后我们可以轻松地绘制它:

mymatx = mymat(:,1:2:end);
mymaty = mymat(:,2:2:end);
figure;
plot(mymatx, mymaty,'+-');

问题:

现在的问题是,如何对包含不等矩阵的单元格进行类似的操作?如:

mycell = {
    [1:2; ones(1,2)]';
    [1:4; ones(1,4)*2]';
    [1:6; ones(1,6)*3]';
    [1:8; ones(1,8)*4]';
    [1:10; ones(1,10)*5]';
    [1:12; ones(1,12)*6]';
    };

mycell = repmat(mycell,1000,1);

我无法像以前那样将它们转换成一个矩阵。我可以使用循环,如this answer中所建议的那样,但如果单元格包含数千个矩阵,则效率非常低。

因此,我正在寻找一种更有效的方法来在单元格数组中绘制不等大小的矩阵。

注意,图中不同的矩阵应该使用不同的颜色。

1 个答案:

答案 0 :(得分:1)

好吧,当我写这个问题的时候,我想出来了......

我想保持问题的开放,因为可能有更好的解决方案。

对于其他人的参考,解决方案很简单:添加NaN以使矩阵大小相等:

% find out the maximum length of all matrices in the array
cellLengthMax = max(cellfun('length', mycell));

% fill the matrices so they are equal in size.
mycellfilled = cellfun(@(x) {[
    x
    nan(cellLengthMax-size(x,1), 2)
    nan(1, 2)
    ]}, mycell);

然后转换为矩阵并绘制:

mymat = cell2mat(mycellfilled');
mymatx = mymat(:,1:2:end);
mymaty = mymat(:,2:2:end);

figure;
plot(mymatx, mymaty,'+-');

mymat看起来像:

     1     1     1     2     1     3     1     4     1     5     1     6
     2     1     2     2     2     3     2     4     2     5     2     6
   NaN   NaN     3     2     3     3     3     4     3     5     3     6
   NaN   NaN     4     2     4     3     4     4     4     5     4     6
   NaN   NaN   NaN   NaN     5     3     5     4     5     5     5     6
   NaN   NaN   NaN   NaN     6     3     6     4     6     5     6     6
   NaN   NaN   NaN   NaN   NaN   NaN     7     4     7     5     7     6
   NaN   NaN   NaN   NaN   NaN   NaN     8     4     8     5     8     6
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN     9     5     9     6
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN    10     5    10     6
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN    11     6
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN    12     6
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

enter image description here

更新

  

绘制6000个矩阵的时间成本:

     

使用此处提出的解决方案:1.183546秒。

     

使用循环:3.450423秒。

还不是很满意。我真的希望将时间减少到0.1秒,因为我正在尝试设计一个交互式UI,用户可以在其中更改一些参数并立即绘制结果。

我不想降低数字的分辨率。

更新

我做了一个分析器,似乎99%的时间浪费在plot(mymatx, mymaty,'+-');上。所以结论是,可能没有其他方法可以解决这个问题。