我们说我有以下内容:
M = randn(10,20);
T = randn(1,20);
我想按M
的每个条目对T
的每一列进行阈值处理。例如,查找M(:,1)
的所有元素的所有指标都大于T(1)
。查找M(:,2)
中大于T(2)
等所有元素的所有标记等
当然,我想在没有for循环的情况下这样做。这可能吗?
答案 0 :(得分:5)
您可以像这样使用bsxfun
:
I = bsxfun(@gt, M, T);
然后I
将成为size(M)
的对数矩阵,其中M(:,i) > T(i)
为
答案 1 :(得分:3)
您可以使用bsxfun
来执行此类操作,但它可能不会比for循环更快(更多内容如下)。
result = bsxfun(@gt,M,T)
这将进行元素明智的比较,并返回一个逻辑矩阵,指示由第一个参数控制的关系。我在下面发布了代码以显示直接比较,表明它确实返回了您要查找的内容。
%var declaration
M = randn(10,20);
T = randn(1,20);
% quick method
fastres = bsxfun(@gt,M,T);
% looping method
res = false(size(M));
for i = 1:length(T)
res(:,i) = M(:,i) > T(i);
end
% check to see if the two matrices are identical
isMatch = all(all(fastres == res))
此功能功能非常强大,可用于帮助加快进程,但请记住,如果有大量数据,它只会加快速度。 bsxfun
必须做一些背景工作,这实际上可能导致它变慢。
如果你有几千个数据点,我只建议使用它。否则,传统的for循环实际上会更快。通过更改M
和T
变量的大小,亲自尝试一下。
答案 2 :(得分:1)
您可以复制阈值向量并使用矩阵比较:
s=size(M);
T2=repmat(T, s(1), 1);
M(M<T2)=0;
Indexes=find(M);