找到与索引

时间:2016-06-22 13:46:48

标签: arrays matlab indexing find

我有一个数组2549x13 double( M )。

示例行:

-7.8095 -4.4135 -0.0881  2.5159  6.3142  6.9519  4.9788  2.9109  0.6623 -0.9269  0.3172  1.2445 -0.0730
 4.5819  6.2371  5.8721  6.1824  5.2074  4.8656  5.0269  5.3340  3.6919  1.3608 -0.5443  0.2871 -1.2070
-6.2273 -3.7767  1.1829  2.8522  3.2428  0.5261 -3.5535 -7.7743 -8.4391 -9.8188 -6.0503 -5.8805 -7.7700
-2.2157 -3.2100 -4.4400 -3.5898 -0.8901  3.4061  6.5631  7.2028  4.3082 -0.7742 -5.0963 -3.1837  0.4372
 5.5682  5.5393  3.4691  0.6789  1.7320  4.4472  3.7622  1.0194 -0.5362 -3.1721 -6.1281 -6.3959 -6.1932
 0.9707 -0.2701 -3.8883 -8.8974 -7.0375 -1.5085  5.4171  6.0831  2.9852 -2.3474 -4.5637 -3.7378  1.3236
-2.811   0.0164  2.7208  5.7862  7.3344  8.3504  9.0635  8.4271  2.7669 -2.1403 -2.2003 -0.9940  0.7729
 4.2382  3.3532  3.5475  7.9209 11.7933 14.3181 13.6289 12.9553 13.7464 14.1331 14.3814 16.7949 15.9003
-0.0539 -2.7059 -3.8141 -2.7531 -1.7465  0.9190  2.2220  0.7268  1.5436  1.0426  2.3535  3.0269  6.4798

我还有一些我需要的值的索引,2549x5 double( inde )。

示例行:

 4  5   6   7   8
 0  1   2   3   4
 3  4   5   6   7
 6  7   8   9   10
-1  0   1   2   3
 6  7   8   9   10
 5  6   7   8   9
10  11  12  13  14
11  12  13  14  15

我现在想要用实际值创建一个新的数组/矩阵。因此,要在数组 M 中找到与索引 inde 对应的值。

但是,如果索引(在 inde 中)等于零,我想取与该行的第1,2,3,4行相对应的值。 如果索引是-1或15,我想在新的数组/矩阵中插入一个NaN。 如果索引是14,我想取对应于10,11,12,13的值。 所以我想获得:

 2.5159  6.3142  6.9519    4.9788    2.9109
 NaN     4.5819  6.2371  5.8721    6.1824
 1.1829  2.8522  3.2428    0.5261   -3.5535
 3.4061  6.5631  7.2028    4.3082   -0.7742
 NaN
-1.5085  5.4171  6.0831    2.9852   -2.3474
 7.3344  8.3504  9.0635    8.4271    2.7669
 14.1331  14.3814  16.7949   15.9003 NaN
 NaN

非常感谢能够提供帮助的人。

2 个答案:

答案 0 :(得分:2)

修改

我建议不要在矩阵中混合使用数字和字符,因为它会成为一个难以处理的单元格结构。 所以我假设我的答案的其余部分是你想要修改数据的零(或任何错误值,例如有时会使用-999)。假设 A 是您的数据矩阵而 i 是您的索引矩阵:

B=zeros(size(i));
for j=1:size(i,1)
    if (prod(i(j,:))==0)
        k=find(i(j,:)==0);
        B(j,k+1:end)= A(j,i(j,k+1:end));
        m=find(i(j,:)<0);
        if (~isempty(m)) 
            B(j,:)= 0;
        end
    else
    B(j,:)= A(j,i(j,:));
    end
end

我明白了:

 2.5159    6.3142    6.9519    4.9788    2.9109
      0    4.5819    6.2372    5.8722    6.1824
 1.1830    2.8522    3.2429    0.5261   -3.5535
 3.4061    6.5632    7.2028    4.3083   -0.7742
     0         0         0         0         0
-1.5086    5.4171    6.0831    2.9853   -2.3475
 7.3344    8.3505    9.0635    8.4271    2.7670

答案 1 :(得分:2)

这将为您提供所需的数组:

rows = size(M, 1);                   % number of rows in M and inde
cols = size(inde, 2);                % number of columns in inde
N = [nan(rows, 2) M nan(rows, 2)];   % pad M with 2 columns of NaN values 
                                     %   on left and right
inde = inde + 2;                     % change indices to account for padding
P = zeros(rows, cols);               % preallocate result matrix
nanrow = nan(1, cols);               % make a row of all NaN values


for row_num = 1:rows
   P(row_num,:) = N(row_num, inde(row_num,:));   % get values from N
   if sum(isnan(P(row_num,:))) > 1   % if 2 NaN values, original index was -1 or 15
      P(row_num,:) = nanrow;         %   so make it all NaN's
   end
end

(我不喜欢在填充时将流浪2留在那里,但我不确定inde的不同数量的列的预期结果是什么,如果这甚至是一个问题。也许floor(cols/2)?)

由于MATLAB不允许你有长度不等的行的矩阵,对于索引为-115的行,我已插入一行所有NaN值。通过修改if子句中的行,显然可以将其更改为您喜欢的任何内容。

使用示例中的Minde结果:

P =    
    2.51590    6.31420    6.95190    4.97880    2.91090
        NaN    4.58190    6.23710    5.87210    6.18240
    1.18290    2.85220    3.24280    0.52610   -3.55350
    3.40610    6.56310    7.20280    4.30820   -0.77420
        NaN        NaN        NaN        NaN        NaN
   -1.50850    5.41710    6.08310    2.98520   -2.34740
    7.33440    8.35040    9.06350    8.42710    2.76690
   14.13310   14.38140   16.79490   15.90030        NaN
        NaN        NaN        NaN        NaN        NaN