Matlab:如何在没有暴力 for 循环的情况下执行行操作?
Matlab: how can I perform row operations without brute-force for loop?
我需要做这样的功能:
N1 = size(X,1);
N2 = size(Xtrain,1);
Dist = zeros(N1,N2);
for i=1:N1
for j=1:N2
Dist(i,j)=D-sum(X(i,:)==Xtrain(j,:));
end
end
(X和Xtrain是稀疏逻辑矩阵)
它运行良好并通过了测试,但我认为它不是最佳且编写良好的解决方案。
如何使用一些内置的 Matlab 函数改进该函数?我对 Matlab 完全陌生,所以我不知道是否真的有机会以某种方式让它变得更好。
您想了解向量化,这里有一些代码可以用来研究比较这种成对距离的不同实现。
首先我们构建两个二进制矩阵作为输入(其中每一行都是一个实例):
m = 5;
n = 4;
p = 3;
A = double(rand(m,p) > 0.5);
B = double(rand(n,p) > 0.5);
1。对每对实例进行双循环
D0 = zeros(m,n);
for i=1:m
for j=1:n
D0(i,j) = sum(A(i,:) ~= B(j,:)) / p;
end
end
2。 PDIST2
D1 = pdist2(A, B, 'hamming');
3。针对所有其他实例对每个实例进行单循环
D2 = zeros(m,n);
for i=1:n
D2(:,i) = sum(bsxfun(@ne, A, B(i,:)), 2) ./ p;
end
4。用网格索引矢量化,全部反对全部
D3 = zeros(m,n);
[x,y] = ndgrid(1:m,1:n);
D3(:) = sum(A(x(:),:) ~= B(y(:),:), 2) ./ p;
5。在三维中矢量化,全部反对全部
D4 = sum(bsxfun(@ne, A, reshape(B.',[1 p n])), 2) ./ p;
D4 = permute(D4, [1 3 2]);
最后我们比较所有的方法都是相等的
assert(isequal(D0,D1,D2,D3,D4))
我需要做这样的功能:
N1 = size(X,1);
N2 = size(Xtrain,1);
Dist = zeros(N1,N2);
for i=1:N1
for j=1:N2
Dist(i,j)=D-sum(X(i,:)==Xtrain(j,:));
end
end
(X和Xtrain是稀疏逻辑矩阵)
它运行良好并通过了测试,但我认为它不是最佳且编写良好的解决方案。
如何使用一些内置的 Matlab 函数改进该函数?我对 Matlab 完全陌生,所以我不知道是否真的有机会以某种方式让它变得更好。
您想了解向量化,这里有一些代码可以用来研究比较这种成对距离的不同实现。
首先我们构建两个二进制矩阵作为输入(其中每一行都是一个实例):
m = 5;
n = 4;
p = 3;
A = double(rand(m,p) > 0.5);
B = double(rand(n,p) > 0.5);
1。对每对实例进行双循环
D0 = zeros(m,n);
for i=1:m
for j=1:n
D0(i,j) = sum(A(i,:) ~= B(j,:)) / p;
end
end
2。 PDIST2
D1 = pdist2(A, B, 'hamming');
3。针对所有其他实例对每个实例进行单循环
D2 = zeros(m,n);
for i=1:n
D2(:,i) = sum(bsxfun(@ne, A, B(i,:)), 2) ./ p;
end
4。用网格索引矢量化,全部反对全部
D3 = zeros(m,n);
[x,y] = ndgrid(1:m,1:n);
D3(:) = sum(A(x(:),:) ~= B(y(:),:), 2) ./ p;
5。在三维中矢量化,全部反对全部
D4 = sum(bsxfun(@ne, A, reshape(B.',[1 p n])), 2) ./ p;
D4 = permute(D4, [1 3 2]);
最后我们比较所有的方法都是相等的
assert(isequal(D0,D1,D2,D3,D4))