2013-03-22 43 views
0

如果我有一个4×1细胞结构表示a=[A1 A2 A3 A4]如何使用Matlab在具有约束的单元格数组中选择相同的值?

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. 

通过调整t他编码以适应这个错误:

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

,您是否试图根据错误编辑'cellfun'线?这是'cellfun(@(x)...,'UniformOutput',false);' – bla 2013-03-22 17:46:05

+0

@natan是的,我应该提到这一点。更新问题 – NLed 2013-03-22 17:46:43

+0

运行此代码后,您对c的期望值是多少? – wakjah 2013-03-22 17:47:32

回答

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. 
+0

非常感谢您的回答。你能告诉我代码是如何工作的吗?我想学习,而不是盲目地使用代码。 – NLed 2013-03-22 18:51:27

+0

当然可以。我会为答案添加评论。 – 2013-03-22 18:52:45

+0

好的,谢谢:) – NLed 2013-03-22 19:06:08

相关问题