在 Matlab 中获取度量矩阵的简单方法
Easy way to get metric matrix in Matlab
假设我有一个字符串向量,我编写了一个函数来查找两个字符串之间的距离。
我想得到这个函数确定的距离矩阵。
我知道使用循环的蛮力方法,但是还有其他更简单的方法吗?
例如:
我的函数:
function [value] = func(str1, str2)
value = abs(str1(1) - str2(1))
end
获取度量矩阵的艰苦方式
v = ['str'; 'rew'; 'ter'];
num = length(v);
metrMat = zeros(num);
for ii = 1:num
for jj = 1:num
metrMat(ii,jj) = func(v(ii),v(jj));
end
end
metrMat
>metrMat =
> 0 1 1
> 1 0 2
> 1 2 0
为什么你这么不愿意使用 for 循环?他们非常快。
利用度量矩阵的对称性属性,可以改进for循环:
for ii = 1:num
for jj = 1:ii
metrMat(ii,jj) = func(v(ii),v(jj));
end
end
metrMat = metrMat + tril(metrMat)'
如果您可以访问统计工具箱,这可以在一行中实现:
metrMat = squareform(pdist(v(1:num)'));
这将是一个 vectorized approach
with bsxfun
-
metrMat = abs(bsxfun(@minus,v(:,1),v(:,1).'))
样本运行-
>> v
v =
str
rew
ter
>> metrMat = abs(bsxfun(@minus,v(:,1),v(:,1).'))
metrMat =
0 1 1
1 0 2
1 2 0
假设我有一个字符串向量,我编写了一个函数来查找两个字符串之间的距离。
我想得到这个函数确定的距离矩阵。 我知道使用循环的蛮力方法,但是还有其他更简单的方法吗?
例如:
我的函数:
function [value] = func(str1, str2)
value = abs(str1(1) - str2(1))
end
获取度量矩阵的艰苦方式
v = ['str'; 'rew'; 'ter'];
num = length(v);
metrMat = zeros(num);
for ii = 1:num
for jj = 1:num
metrMat(ii,jj) = func(v(ii),v(jj));
end
end
metrMat
>metrMat =
> 0 1 1
> 1 0 2
> 1 2 0
为什么你这么不愿意使用 for 循环?他们非常快。
利用度量矩阵的对称性属性,可以改进for循环:
for ii = 1:num
for jj = 1:ii
metrMat(ii,jj) = func(v(ii),v(jj));
end
end
metrMat = metrMat + tril(metrMat)'
如果您可以访问统计工具箱,这可以在一行中实现:
metrMat = squareform(pdist(v(1:num)'));
这将是一个 vectorized approach
with bsxfun
-
metrMat = abs(bsxfun(@minus,v(:,1),v(:,1).'))
样本运行-
>> v
v =
str
rew
ter
>> metrMat = abs(bsxfun(@minus,v(:,1),v(:,1).'))
metrMat =
0 1 1
1 0 2
1 2 0