我有一个单元格数组C
,其元素是n维数字数组。例如:
C = {[111 121 131; 211 221 231], ...
[112 122 132; 212 222 232], ...
[113 123 133; 213 223 233], ...
[114 124 134; 214 224 234]};
我正在寻找一种方便的方法来测试C
中的所有nd数组是否具有相同的形状(由size
函数报告)。
这里的平等标准并非完全无足轻重。根据具体情况,您可能希望将[2 3 4]
的形状视为与[1 2 3 4]
或[2 1 3 1 4]
的形状不同或相等。
出于我的直接目的,我希望将[2 3 4]
视为与[1 2 3 4]
等不同。
(顺便说一句:订单总是很重要;例如,[2 3 4]
永远不会等于[4 3 2]
,比如说。)
我尝试了几件事(例如,获得unique(C)
的长度),但它们都失败了......(经过近两年的使用,我的MATLAB本能仍然接近于零。)
答案 0 :(得分:6)
针对一个单元格的大小(例如第一个单元格)测试C
的每个单元格的大小。要测试大小相等,您需要isequal
(==
不会这样做,因为大小的大小可能不同)。
all(cellfun(@(e) isequal(size(C{1}), size(e)) , C(2:end)))
如果您想将大小[2 3 4]
视为等于[1 2 3 4]
等,只需添加squeeze
:
size1 = size(squeeze(C{1}));
all(cellfun(@(e) isequal(size1, squeeze(size(e))) , C(2:end)))
答案 1 :(得分:0)
现在不要在这里使用matlab,但假设C
只有1维,这可能会有效
length(C)==1 || any(cellfun(@(cell)size(cell)~=size(C{1}),C(2:end)));
修改:使用~isequal(size(C{1}),size(cell))
代替〜=
它相当于
function bool=testCell(C)
if length(C) == 1
bool=1;
return
end
for i=2:length(C)
if ~isequal(size(C{1}),size(cell))
bool=0;
return
end
end
bool=1
答案 2 :(得分:0)
尝试以下方法:
length(unique(cellfun('size',C,1)))
length(unique(cellfun('size',C,2)))
如果两者都返回1,那么C包含的所有数组都具有相同的size
。
根据help cellfun
:
CELLFUN('size',C,K)返回沿着K维的大小 C的每个细胞的内容。
答案 3 :(得分:0)
一个偷偷摸摸(简单)的小技巧是try
如果大小不匹配会出现错误,比如连接:
try
[C{:}]; %// doesn't catch different size(..,2)
vertcat(C{:}); %// this does, size(..,1) is already consistent at this point
samesize = true;
catch e
samesize = false;
end
或递归+
(无论如何都是个好主意,尽管您可能希望以更强大的方式实现它):
try rplus(C); samesize = true; catch samesize = false; end
function total = rplus(cell)
if isscalar(cell), total = cell{1};
else total = cell{1} + rplus(cell(2:end));
end
end