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

Matlab: Plot non-equal matrices in a cell array without a loop

知道:

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

例如,绘制 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);

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

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

注意图中不同的矩阵要用不同的颜色

好吧,在我写问题的时候,我想通了...

我想保留这个问题,因为可能有更好的解决方案。

供大家参考,解决方法很简单:添加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

更新:

Time cost for plotting 6000 matrices:

using the solution proposed here: 1.183546 seconds.

using a loop: 3.450423 seconds.

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

我不想降低图的分辨率。

更新:

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