【问题标题】:Find the value that corresponds to an index查找对应于索引的值
【发布时间】:2016-06-22 13:46:48
【问题描述】:

我有一个 2549x13 双精度数组 (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 中)等于 0,我想取对应于该行的索引 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

非常感谢任何可以提供帮助的人。

【问题讨论】:

  • 你的问题有很多问题。首先,MATLAB 不会将索引标识为零。所以你的条件之一是无效的。我假设您的意思是第一个索引。在那之后,你想要的矩阵有一些问题。第二行在最后一列中没有元素。第8行的问题也是如此。即第一列中没有元素。 &什么是NA?它是 1x5 行向量吗?考虑到NA 是所有NaN 的一行并随机填充第 2 行和第 8 行中的缺失元素,我能够产生您想要的结果!当你澄清提到的问题时,我会发布答案
  • @Sardar_Usama 重新索引:我所做的是确定矩阵 M 中每一行的最大值。 [Peak Ind] = max(M, [], 2); 然后我需要考虑最大值前后的 2 个值。 inde = bsxfun(@plus,Ind, -2:2); 这就是我在索引中获得零的原因。
  • @Sardar_Usama 重新需要的矩阵:我想要的是最大值前后的 2 个值。但是,当 inde 中的索引为 0 时,这意味着我的最大值在矩阵 M 的第二列中。因此,我只需要考虑最大值之前的 1 个值,以及最大值之后的 2 个值。这就是为什么第二行的最后一个值丢失的原因。第 8 行也一样。这里的最大值在倒数第二列。因此,我需要考虑最大值之前的 2 个值,以及最大值之后的 1 个值。这就是缺少第 8 行第一个值的原因。
  • 但是,我可以使用 NA 而不是缺失值。
  • 什么是NA? ‍‍‍‍‍‍ ‍‍‍‍‍‍

标签: arrays matlab indexing find


【解决方案1】:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 当我尝试运行这段代码时,出现错误:Index exceeds matrix dimensions.
    • 当j等于64时循环停止工作。从64开始矩阵B全为零,出现我上面报的错误。
    • 我更新了我的问题,因为零和 -1 有另外两个例外(当索引等于 14 或 15 时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2013-04-11
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多