通过给定行向量及其对应的位置矩阵将值替换为矩阵

kar*_*fai 0 matlab vector matrix


我有一个A = [m,n]矩阵和一个B = [1,n]矩阵.

A是对于m行具有1:n的排列的矩阵.

A =
[2 4 1 5 3
5 2 3 4 1
1 2 3 4 5]

B只是一个普通的行向量(每个单元格的值不是必需的唯一)

B = [0.05 0.03 0.06 0.04 0.02]

现在,我想根据Matrix A的每一行置换B.例如,

i = 1
B(指数(i,:))= [0.03 0.04 0.05 0.02 0.06]

在for循环之后,那是我想要的结果:

C =
[0.03 0.04 0.05 0.02 0.06
0.02 0.03 0.06 0.04 0.05
0.05 0.03 0.06 0.04 0.02]

但是,我处理的当前矩阵非常大,例如m = 100,n = 80,是否有任何构建函数来代替使用for循环?

ray*_*ica 6

满容易.只需用于A索引B:

A = [2 4 1 5 3;
     5 2 3 4 1;
     1 2 3 4 5];

B = [0.05 0.03 0.06 0.04 0.02];

B(A)

ans =

    0.0300    0.0400    0.0500    0.0200    0.0600
    0.0200    0.0300    0.0600    0.0400    0.0500
    0.0500    0.0300    0.0600    0.0400    0.0200
Run Code Online (Sandbox Code Playgroud)

你可能在想......哇!......这是怎么回事?因为如何A被构造,中的每个元素A是访问一个特定的元素的准确索引B,所以我们可以使用逃脱A直接作为我们没有界限以外的相对于所述矢量的长度的任何元件B. 如你有这样一种情况,其中任何元素为零,负或大于长度B(或任何浮点数也......),那么上面的代码将不起作用.

MATLAB索引的工作原理是,如果提供索引的向量或矩阵作为访问另一个向量的参数,则输出将与此输入参数具有相同的形状,并且每个输出元素将对应于每个位置的值你想要访问.


例如,假设我有这个向量:

B = [9 8 7 6 5];
Run Code Online (Sandbox Code Playgroud)

......我有这个矩阵:

A = [1 1 1;
     2 2 2;
     3 3 3];
Run Code Online (Sandbox Code Playgroud)

我的输出是:

B(A)

ans = 

9  9  9
8  8  8
7  7  7
Run Code Online (Sandbox Code Playgroud)

无论形状如何A,都将是输出的形状,输出的每个元素都会访问由矩阵索引的值A.因此,因为第一行A都是1,所以我们将有一整行9,这是第一行的元素B.之后,第二行A全部为2,输出为B8,依此类推.

我提供了一个很好的教程,介绍了我之前发布的一篇文章(实际上,我在StackOverflow上写过的第一篇帖子之一......):

在Matlab中与矩阵索引的向量混淆

祝好运!