如果通过除以最大值来标准化每列,则比例变为相等.这使问题更容易.
现在,为了测试相等性,可以在列上使用单个(外部)循环;内部循环很容易用bsxfun进行矢量化.要获得更高的速度,请仅将每列与其右侧的列进行比较.
同样为了节省一些时间,结果矩阵被预先分配到一个近似大小(您应该设置它).如果大概的大小是错误的,唯一的惩罚将是速度稍慢,但代码工作.
像往常一样,浮点值之间的相等性测试应该包括容差.
结果以2列矩阵(S)给出,其中每行包含两行成比例的索引.
A = [1 5 2 6 3 1
2 5 4 7 6 1
3 5 6 8 9 1]; %// example data matrix
tol = 1e-6; %// relative tolerance
A = bsxfun(@rdivide, A, max(A,[],1)); %// normalize A
C = size(A,2);
S = NaN(round(C^1.5),2); %// preallocate result to *approximate* size
used = 0; %// number of rows of S already used
for c = 1:C
ind = c+find(all(abs(bsxfun(@rdivide, A(:,c), A(:,c+1:end))-1)
u = numel(ind); %// number of columns proportional to column c
S(used+1:used+u,1) = c; %// fill in result
S(used+1:used+u,2) = ind; %// fill in result
used = used + u; %// update number of results
end
S = S(1:used,:); %// remove unused rows of S
在这个例子中,结果是
S =
1 3
1 5
2 6
3 5
意思是第1列与第3列成比例;第1列与第5列等成比例