关于在单元阵列中绘制相同大小的矩阵有很多讨论,没有循环就很容易做到。
例如,在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中所建议的那样,但如果单元格包含数千个矩阵,则效率非常低。
因此,我正在寻找一种更有效的方法来在单元格数组中绘制不等大小的矩阵。
注意,图中不同的矩阵应该使用不同的颜色。
答案 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
绘制6000个矩阵的时间成本:
使用此处提出的解决方案:1.183546秒。
使用循环:3.450423秒。
还不是很满意。我真的希望将时间减少到0.1秒,因为我正在尝试设计一个交互式UI,用户可以在其中更改一些参数并立即绘制结果。
我不想降低数字的分辨率。
我做了一个分析器,似乎99%的时间浪费在plot(mymatx, mymaty,'+-');
上。所以结论是,可能没有其他方法可以解决这个问题。