MATLAB:我想基于矢量中的阈值来阈值矩阵,而不需要for循环。可能?

时间:2014-01-27 16:05:27

标签: matlab matrix indexing find

我们说我有以下内容:

M = randn(10,20);
T = randn(1,20);

我想按M的每个条目对T的每一列进行阈值处理。例如,查找M(:,1)的所有元素的所有指标都大于T(1)。查找M(:,2)中大于T(2)等所有元素的所有标记等

当然,我想在没有for循环的情况下这样做。这可能吗?

3 个答案:

答案 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循环实际上会更快。通过更改MT变量的大小,亲自尝试一下。

答案 2 :(得分:1)

您可以复制阈值向量并使用矩阵比较:

s=size(M);
T2=repmat(T, s(1), 1);
M(M<T2)=0;
Indexes=find(M);