matlab - 通过给定的真值行索引生成逻辑矩阵的最快方法?

标签 matlab matrix vectorization

最有效的生成方式是什么

>> A

A =

     0     1     1
     1     1     0
     1     0     1
     0     0     0

>> B = [2 3; 1 2; 1 3]

B =

     2     3
     1     2
     1     3

在 MATLAB 中?

例如,B(1, :),即[2 3],表示A(2, 1)A(3, 1)true

我的尝试仍然需要一个 for 循环,迭代 B 的行。是否有无循环或更有效的方法来执行此操作?

最佳答案

不过,这只是多种方式中的一种 sub2ind是专门用于此目的的函数:

%// given row indices
B = [2 3; 1 2; 1 3]
%// size of row index matrix
[n,m] = size(B)
%// size of output matrix
[N,M] = deal( max(B(:)), n)
%// preallocation of output matrix
A = zeros(N,M)
%// get col indices to given row indices
cols = bsxfun(@times, ones(n,m),(1:n).')
%// set values
A( sub2ind([N,M],B,cols) ) = 1

A =

     0     1     1
     1     1     0
     1     0     1

如果你想要一个逻辑矩阵,请将以下内容更改为行

A = false(N,M)
A( sub2ind([N,M],B,cols) ) = true

替代解决方案

%// given row indices
B = [2 3; 1 2; 1 3];
%// number if rows
r = 4;  %// e.g. = max(B(:))
%// number if cols
c = 3;  %// size(B,1)

%// preallocation of output matrix
A = zeros(r,c);
%// set values
A( bsxfun(@plus, B.', 0:r:(r*(c-1))) ) = 1;

关于matlab - 通过给定的真值行索引生成逻辑矩阵的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38410437/

相关文章:

matlab - 在Matlab中以赫兹演奏频率变化吗?

c++ - 3D空间中三个3D点的线性插值

c - 根据我的编译器的说法,我错误地使用了指针来设置二维数组的值。但是,我不确定我到底做错了什么

vector - 从 View 矩阵中获取眼睛、目标和向上向量

python - PyTorch - 有效地应用注意力

r - 应用一个函数,将矩阵的列和行作为输入,将矩阵作为输出,而不使用循环

matlab - 您认为生物信息学的最佳语言是什么?

python - 如何将矩阵从 Matlab 转换为 Python?

algorithm - 查找邻接矩阵图的连通分量

matlab - 创建一个零填充的二维数组,其中的元素位于由向量索引的位置