【问题标题】:how to create a vector based on two auxiliary vectors in Matlab如何在Matlab中基于两个辅助向量创建一个向量
【发布时间】:2020-08-08 15:07:27
【问题描述】:

我正在创建一个 Matlab 程序来处理包含有限整数(不必是连续的)的数据数组。假设我的数据数组是A,我需要先找到A的唯一值,形成一个向量B,我必须计算A中每个唯一值的出现次数,这给出另一个向量C。最后,我需要一个向量 E,它与 A 的长度相同,但 E 的第 i 个元素的值计算为 E(i) = C(k)k = A(i)

我有如下代码来创建 B 和 C:

A=[5 5 1 1 3 1 3 11 9 6 -2];
[B, ia, ic]=unique(A);
C = accumarray(ic,1);

A 可能是一个大向量,A 的元素可能非常不同,范围很广,我想知道是否有任何向量化方法来生成数组 E 而不是下面的循环方法

E = zeros(size(A));
for n=1:length(E)
  k=find(B==A(n));
  E(n) = C(k);
end

【问题讨论】:

    标签: matlab indexing vectorization


    【解决方案1】:

    如您所说,要计算E 的值,您需要计算B 中的索引,这些索引对应于A 中的每个元素,即A == B。这显然行不通,因为AB 的大小不同。但是我们可以通过将事物视为 2D 网格来获得我们想要的东西。转置其中一个向量并使它们相等。

    A == B.'
    % or for older versions of MATLAB (won't implicitly expand the different sized variables)
    bsxfun(@eq, A, B.')
    
    ans =
    
      7×11 logical array
    
       0   0   0   0   0   0   0   0   0   0   1
       0   0   1   1   0   1   0   0   0   0   0
       0   0   0   0   1   0   1   0   0   0   0
       1   1   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   1   0
       0   0   0   0   0   0   0   0   1   0   0
       0   0   0   0   0   0   0   1   0   0   0
    % to help visualise
    % A = [5 5 1 1 3 1 3 11 9 6 -2];
    % B = [-2 1 3 5 6 9 11];
    

    您可以看到,对于每一列,1 的位置告诉我们可以在向量B 中的A 中找到该元素的位置。我们可以使用find获取每个1的行索引,并用它来计算E。

    [indices, ~] = find(A == B.');
    E = C(indices);
    

    最终结果

    如果你想用一行代码来计算,你可以使用下面的方法

    A=[5 5 1 1 3 1 3 11 9 6 -2];
    [B, ia, ic]=unique(A);
    C = accumarray(ic,1);
    E = C(mod(find(B.' == A)-1, length(B))+1).';
    % or for older versions of MATLAB
    E = C(mod(find(bsxfun(@eq, A, B.'))-1, length(B))+1).';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多