如果我有一个代表a=[A1 A2 A3 A4]
的4x1 Cell结构:
a=cell(4,1)
a{1}=[1 3 1 0]
a{2}=[3 3 3 3]
a{3}=[3 2 3 2]
a{4}=[3 3 3 2]
B=[1 1 1 2]; %priority
我想执行以下操作:
选择与优先级B=[1 1 1 2]
相对应的单元格(其中B=1
为最高优先级,A=3
)
这意味着,找到任何以[3 3 3#]开头的单元格,其中B
的所有优先级都是1。
理想的答案应该是:a{2}
= [3 3 3 3]
和a{4}
= [3,3,3,2]
我的尝试是添加这个:
[P arrayind]=min(B) % problem is that arrayind return index=1 only .. not all indices
if P==1
arrayindex = 1:4 ; %look at each index of the array
c = a(cellfun(@(x) ismember(x(arrayindex), 3), a));
end
然而,这给我一个错误说明:
Error using cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
通过调整代码来适应此错误:
c = a(cellfun(@(x) ismember(x(arrayindex), 3), a,'UniformOutput',false));
I get this error :
Error using subsindex
Function 'subsindex' is not defined for values of class 'cell'.
现在我陷入了困境。
答案 0 :(得分:1)
这可能不是一个优雅的答案,但它是有效的:
%The input cell array.
a = cell(4,1);
a{1} = [1 3 1 0];
a{2} = [3 3 3 3];
a{3} = [3 2 3 2];
a{4} = [3 3 3 2];
%The input priority array.
B = [1 1 1 2];
%The output cell array: preallocated for efficiency.
c = cell(size(a));
j = 1;
for i = 1:size(a,1)
%For each i
if(all(((cell2mat(a(i))==3)&(B==1))==(B==1)))
%"cell2mat" converts the cell arrays into easily comparable number arrays.
%"X==Y" for matrices of the same size, will give you a result matrix of the same size with 1 where the values are equal and 0 elsewhere.
%Thus, "cell2mat(a(i))==3" would compare the number matrices represented by "a{i}" with "3".
%"(cell2mat(a(i))==3)&(B==1)" would do a logical AND operation with "B==1", that is, "[1 1 1 0]".
%In short, since you want whereever "a{i}" is 3 when "B" is 1, we want those "a{i}" where the comparison stated above is the same as "B==1".
%If the result array is the same as "B=1", we get "[1 1 1 1]" as the result of the comparison "((cell2mat(a(i))==3)&(B==1))==(B==1)".
%The function "all" checks whether the input to it is completely non-zero: here if we get a "[1 1 1 1]" "all" will give us 1, else 0.
c{j} = a{i};
%Insert result array into "c" when condition is satisfied.
j = j + 1;
%Increment the index of "c".
end
end
c = c(1:j-1);
%Truncate unused rows of "c".
cell2mat(c)
%Displays the value of "c" as computed.