簡體   English   中英

MATLAB-避免在單元格數組中的向量中重復值,然后執行下一個

[英]MATLAB - Avoid repeated values in a vector inside cell arrays and take next

這就是問題:

我在indx{ii}形式上有一個單元格數組,其中每個ii是大小為1xNii的數組(這意味着數組具有不同的大小)。 還有indy{jj}形式的另一個單元格數組,其中每個jj是與ii大小相同的數組。

問題是我想創建一個函數來計算indx{:}數組中的值,並采用第一個不重復的值,如果是重復值,則采用下一個值。

我將嘗試用一個例子來解釋。 假設我們有indxindy這兩個單元格數組:

indx{1} = [1 3 2 7];
indx{2} = [3 8 5];
indx{3} = [3 6 2 9];
indx{4} = [1 3 4];
indx{5} = [3 1 4];

indy{1} = [0.12 0.21 0.31 0.44];
indy{2} = [0.22 0.34 0.54];
indy{3} = [0.13 0.23 0.36 0.41];
indy{4} = [0.12 0.16 0.22];
indy{5} = [0.14 0.19 0.26]; 

我要代碼執行的操作是獲取第一個值,並且在indx不重復,而在indy等效。 因此,示例的答案應為:

ans=

indx{1} = 1;
indx{2} = 3;
indx{3} = 6;
indx{4} = 4;
indx{5} = [];

indy{1} = 0.12;
indy{2} = 0.22;
indy{3} = 0.23;
indy{4} = 0.22;
indy{5} = [];

ans ,對於indx{1} ,代碼采用1因為它是第一個,並且不重復,並且在indy采用等效值。 然后,對於indx{2}它需要3因為它是第一個值,並且之前沒有在任何數組中重復作為第一個值。 但是對於ind{3}它取6 ,因為重復的第一個值是3 ,並且將indy的等效值取為6 ,即0.23 對於ind{4}的第一個和第二個值,它們已經作為第一個值重復了,因此代碼取4indy等效值。 最后,對於indx{5}由於所有值均已重復,因此代碼不應取值。

indx{1} = [1 3 2 7];
indx{2} = [3 8 5];
indx{3} = [3 6 2 9];
indx{4} = [1 3 4];
indx{5} = [3 1 4];

indy{1} = [0.12 0.21 0.31 0.44];
indy{2} = [0.22 0.34 0.54];
indy{3} = [0.13 0.23 0.36 0.41];
indy{4} = [0.12 0.16 0.22];
indy{5} = [0.14 0.19 0.26]; 

indx2 = NaN(numel(indx),1);
indx2(1) = indx{1}(1);
indy2 = NaN(numel(indy),1);
indy2(1) = indy{1}(1);
for ii = 2:numel(indx)
    tmp1 = indx{ii}'; % get the original as array
    tmp2 = indy{ii}';
    if numel(tmp1)>numel(indx2)
        tmp3 = [indx2;NaN(numel(tmp1)-numel(indx2),1)];
        tmp4 = [indx2;NaN(numel(tmp1)-numel(indx2),1)];
    else
        tmp1 = [tmp1;NaN(numel(indx2)-numel(tmp1),1)];
        tmp2 = [tmp2;NaN(numel(indx2)-numel(tmp2),1)];
        tmp3 = indx2;
        tmp4 = indy2;
    end
    tmp5 = ~ismember(tmp1,tmp3); % find first non equal one
    tmp6 = find(tmp5,1,'first');
    indx2(ii) = tmp1(tmp6); % save values
    indy2(ii) = tmp2(tmp6);
end
N = numel(indx2);
indx2 = mat2cell(indx2, repmat(1,N,1));
N = numel(indy2);
indy2 = mat2cell(indy2, repmat(1,N,1));

indx2 =

    [  1]
    [  3]
    [  6]
    [  4]
    [NaN]

我在這里要做的是首先將輸出單元格初始化為具有與原始數據相同數量的單元格。 然后,我分配值1,因為該值將始終是唯一的,因此它是第一項。 之后,我使用for循環首先將所有四個單元格數組(2個輸入,兩個輸出)轉換為常規數組,以使用ismember進行處理,在其中檢查下一個輸入單元格與您的現有數字之間的所有非等號輸出。 然后使用find獲得第一個不匹配的數字。 最后,將數字分配給數組(如果存在)。

作為對NaN使用布爾值的評論,請嘗試NaN ~=NaNNaN ==NaN 第一個給你1,而第二個給你零。 這種質量使NaN在這里成為填充劑的理想選擇,因為0 == 0將導致1:

A = [1,2,5,4,NaN];
B = [1,3,7,NaN,NaN];
ismember(A,B)
=

     1     0     0     0     0

因此,NaN彼此不相等,因此不會污染您的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM