【发布时间】:2015-03-15 17:29:52
【问题描述】:
我在对以下代码进行矢量化处理时非常困难,不幸的是,您需要查看它以了解发生了什么。
简而言之,此函数比较一组数据行并创建一个比较关系矩阵。两个嵌套循环调用内部函数(即compare_weights())来比较数据行中的某些特定列。比较函数根据嵌套的if-then-else 决策返回0、-1 或1。所以,这里是主循环--
data = rand(4);
disp(data)
[nrow,~] = size(data);
mat = zeros(nrow,nrow);
% fill only the upper triangular of mat
for i = 1:nrow
for j = i + 1:nrow
if(i ~= j)
% compare_weights() is a function with some nested
% if-then-else, that compares the values of 1st,2nd and
% 4th columns in data and populates the matrix mat.
mat(i, j) = ...
compare_weights(data(i,1:2), data(i,4), ...
data(j,1:2), data(j,4));
end
end
end
% after the loop, the mat contains the weight comparison relations
% among all the rows in data.
disp(mat)
而内部函数compare_weights() 看起来像这样--
function [ val ] = compare_weights(w1,v1,w2,v2)
% This function takes the values w1, v1, w2, v2 tuple
% and does some comparisons, according to the decision
% this returns -1, 1 or 0.
if(v1 < 0 && v2 < 0)
if(v1 > v2)
val = 1 ;
return ;
elseif(v1 < v2)
val = -1 ;
return ;
else
val = 0;
return ;
end
else
if(v1 < 0 && v2 == 0)
val = -1 ;
return ;
elseif(v1 == 0 && v2 < 0)
val = 1 ;
return ;
else
if(all(w1 > w2))
val = -1 ;
return ;
elseif(all(w1 < w2))
val = 1 ;
return ;
else
val = 0 ;
return ;
end
end
end
end
在执行代码时,您应该在mat 中获得这种值--
0 -1 -1 0
0 0 -1 0
0 0 0 1
0 0 0 0
当data 为 --
0.5958 0.8310 0.2471 0.5445
0.5004 0.2755 0.4761 0.6410
0.1435 0.1618 0.5691 0.3250
0.9514 0.2711 0.2264 0.1543
我不知道如何对其进行矢量化,甚至不确定它是否可以矢量化。任何指针都会非常有帮助。
【问题讨论】:
-
在同一代码中使用
data(row,1:2)和data(col,1:2)非常令人困惑,因为row和col都引用...行! -
@CrazyRat 是的,抱歉,
row/col实际上是指mat的row/col:-(,已更正。
标签: matlab matrix vectorization