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,'+-');
上。所以结论是,可能没有其他方法可以固定这个。
知道:
有很多关于在元胞数组中绘制大小相等的矩阵的讨论,没有循环就很容易做到。
例如,绘制 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,'+-');
上。所以结论是,可能没有其他方法可以固定这个。