相关疑难解决方法(0)

在Matlab中,何时使用bsxfun是最佳的?

我的问题:我注意到很多关于SO的Matlab问题的好答案经常使用这个功能bsxfun.为什么?

动机:在Matlab文档中bsxfun,提供了以下示例:

A = magic(5);
A = bsxfun(@minus, A, mean(A))
Run Code Online (Sandbox Code Playgroud)

当然我们可以使用以下方法执行相同的操作:

A = A - (ones(size(A, 1), 1) * mean(A));
Run Code Online (Sandbox Code Playgroud)

事实上,简单的速度测试表明第二种方法的速度提高了约20%.那么为什么要使用第一种方法?我猜测在某些情况下使用bsxfun将比"手动"方法快得多.我真的很想看到这种情况的一个例子,并解释为什么它更快.

此外,这个问题的最后一个元素,再次来自Matlab文档bsxfun:"C = bsxfun(fun,A,B)将函数句柄fun指定的逐元素二元运算应用于数组A和B,使用单例扩展已启用." 短语"启用单例扩展"是什么意思?

arrays matlab bsxfun

132
推荐指数
5
解决办法
3万
查看次数

Matlab - bsxfun不再比repmat快吗?

我正在尝试找到在Matlab中标准化矩阵的最快方法(零均值,单位方差列).这一切都归结为将相同操作应用于矩阵中所有行的最快方法.我读过的每篇文章都得出了相同的结论:使用bsxfun而不是repmat.本文由Mathworks编写,是一个例子:http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/

但是,在我自己的计算机上尝试这个时,repmat总是更快.以下是我使用与文章中相同代码的结果:

m = 1e5;
n = 100;
A = rand(m,n);

frepmat = @() A - repmat(mean(A),size(A,1),1);
timeit(frepmat)

fbsxfun = @() bsxfun(@minus,A,mean(A));
timeit(fbsxfun)
Run Code Online (Sandbox Code Playgroud)

结果:

ans =

    0.0349


ans =

    0.0391
Run Code Online (Sandbox Code Playgroud)

事实上,无论输入矩阵有多小或多大,我都无法在这种情况下使bsxfun表现得比repmat更好.

有人可以解释一下吗?

arrays matlab bsxfun

21
推荐指数
1
解决办法
2549
查看次数

BSXFUN关于关系操作的内存效率

我想在这里研究两件事 -

  • 有六种内置与使用关系操作bsxfun:@eq (equal),@ne (not-equal),@lt (less-than),@le (less-than or equal),@gt (greater-than)@ge (greater-than or equal).很多时候我们在浮点数上使用它们并进行关系操作,它们输出逻辑数组.所以,让我很好奇,如果bsxfun在浮点数上使用这些关系运算时的固有扩展涉及输入元素的实际复制,这正是我的第一个问题.

  • 我还想知道这个内存效率问题如何转换为何anonymous functions时使用bsxfun,再次与关系操作的情况一起使用.

这是受到的runtime/speedup测试的启发Comparing BSXFUN and REPMAT.

memory matlab memory-management vectorization bsxfun

6
推荐指数
1
解决办法
457
查看次数

在Matlab中从两个向量的索引创建字符串

我有两个向量a,b作为一个例子:

a = [1 2 3 4]; b = [5 6 7 8];

我想创建的索引弦ab:

c1 = a(1):b(1) = [1 2 3 4 5];
c2 = a(2):b(2) = [2 3 4 5 6];
c3 = a(3):b(3) = [3 4 5 6 7];
c4 = a(4):b(4) = [4 5 6 7 8]; 
Run Code Online (Sandbox Code Playgroud)

然后我想连接获得的字符串:

C = cat(2, c1, c2, c3, c4) = [1 2 3 4 5 2 3 4 5 6 3 4 5 …

arrays matlab

6
推荐指数
2
解决办法
127
查看次数

在MATLAB中有效计算加权距离

几个 帖子 存在约高效计算MATLAB成对距离.这些帖子往往涉及快速计算大量点之间的欧氏距离.

我需要创建一个函数来快速计算较小数量的点(通常少于1000对)之间的成对差异.在我正在编写的程序的宏伟方案中,此功能将执行数千次,因此即使效率的微小提高也很重要.该功能需要以两种方式灵活:

  1. 在任何给定的呼叫中,距离度量可以是欧几里德或城市街区.
  2. 数据的维度是加权的.

据我所知,这个特定问题没有解决方案.statstics工具箱提供了pdistpdist2,它们接受许多不同的距离函数,但不能加权.我已经看到这些功能的扩展允许加权,但这些扩展不允许用户选择不同的距离功能.

理想情况下,我想避免使用统计工具箱中的函数(我不确定该函数的用户是否可以访问这些工具箱).

我写了两个函数来完成这个任务.第一个使用棘手的调用来进行repmat和permute,第二个只使用for循环.

function [D] = pairdist1(A, B, wts, distancemetric)

% get some information about the data
    numA = size(A,1);
    numB = size(B,1);

    if strcmp(distancemetric,'cityblock')
        r=1;
    elseif strcmp(distancemetric,'euclidean')
        r=2;
    else error('Function only accepts "cityblock" and "euclidean" distance')
    end

%   format weights for multiplication
    wts = repmat(wts,[numA,1,numB]);

%   get featural differences between A and B pairs
    A = repmat(A,[1 1 numB]);
    B = repmat(permute(B,[3,2,1]),[numA,1,1]);
    differences = abs(A-B).^r;

%   weigh difference …
Run Code Online (Sandbox Code Playgroud)

arrays performance matlab distance matrix

6
推荐指数
2
解决办法
720
查看次数

如何在不使用for循环的情况下对不同大小的矩阵的部分求和?

我有一个相对较大的矩阵NxN(N~20,000)和一个Nx1向量,用于识别必须组合在一起的索引.

我想将矩阵的一部分加在一起,原则上可以有不同数量的元素和非相邻元素.我很快写了一个正常工作的双循环,但当然效率很低.分析器将这些循环识别为我的代码中的瓶颈之一.

我试图找到一种智能矢量化方法来解决这个问题.我探索了arrayfun,cellfunbsxfun函数,并寻找类似问题的解决方案......但我还没有找到最终的解决方案.

这是带有两个for循环的测试代码:

M=rand(10); % test matrix
idxM=[1 2 2 3 4 4 4 1 4 2]; % each element indicates to which group each row/column of M belongs
nT=size(M,1);
sumM=zeros(max(idxM),max(idxM));
for t1=1:nT
    for t2=1:nT
        sumM(t1,t2) = sum(sum(M(idxM==t1,idxM==t2)));
    end
end
Run Code Online (Sandbox Code Playgroud)

matlab matrix vectorization bsxfun

6
推荐指数
1
解决办法
115
查看次数

setdiff逐行而不在matlab中使用循环

假设我们有两个矩阵

A = [1,2,3;
     2,4,5;
     8,3,5]
B=  [2,3;
     4,5;
     8,5]
Run Code Online (Sandbox Code Playgroud)

如何sediff在不使用循环或cellfun的情况下分别对A和B中的每一行执行,换句话说,setdiff(A(i,:),B(i,:))对所有人执行i.对于这个例子,我想得到

[1;
 2;
 3]
Run Code Online (Sandbox Code Playgroud)

我正在尝试为我的流体模拟器为两个非常大的矩阵做这个,因此我不能在性能上妥协.

更新:

你可以假设答案的第二个维度(列数)是固定的,例如答案总是一些n乘m矩阵而不是一些不同列大小的参差不齐的数组.

另一个例子:

在我的情况下,A和B分别是m乘3和m乘以2,答案应该是m乘1.对于这种情况的解决方案就足够了,但是对于大小为m的矩阵的一般解由n1,m乘以n2,答案为m by n3将非常有趣.另一个例子是

A = [1,2,3,4,5;
     8,4,7,9,6]
B = [2,3;
     4,9]
Run Code Online (Sandbox Code Playgroud)

答案是

C = [1,4,5;
     8,7,6]
Run Code Online (Sandbox Code Playgroud)

matlab matrix vectorization

4
推荐指数
1
解决办法
717
查看次数

在Matlab中矢量化数组索引/子集

假设我有一个长数据向量y,加上一些索引.我想在每个索引周围提取一个简短的片段或窗口.

例如,假设我想构建一个包含64个样本的矩阵,并且在每个低于3的值之后构建64个样本.在for循环中这很简单:

WIN_SIZE = 64;

% Sample data with padding
data = [nan(WIN_SIZE,1); randn(1e6,1); nan(WIN_SIZE,1)];

% Sample events, could be anything
index = find(data < 3); 

snippets = nan(length(index), 2*WIN_SIZE + 1);
for ii=1:length(index)
   snippets(ii,:) = data((index(ii)-WIN_SIZE):(index(ii)+WIN_SIZE));
end
Run Code Online (Sandbox Code Playgroud)

然而,这并不是非常快.有没有办法对这个操作进行矢量化(或以其他方式加速)?

(如果不清楚,索引可能是任何东西,可能不一定是数据的属性;我只是想要一些简单的东西来说明这个想法.)

matlab vectorization

4
推荐指数
1
解决办法
106
查看次数

Permuting columns of a matrix in MATLAB

Say I have an n by d matrix A and I want to permute the entries of some columns. To do this, I compute permutations of 1 ... n as

idx1 = randperm(n)'
idx2 = randperm(n)'
Run Code Online (Sandbox Code Playgroud)

Then I could do:

A(:,1) = A(idx1,1)
A(:,2) = A(idx2,2)
Run Code Online (Sandbox Code Playgroud)

However, I dont want to do this using a for-loop, as it'll be slow. Say I have an n by d matrix A and an n by d index matrix IDX that specifies …

random matlab permutation matrix vectorization

4
推荐指数
1
解决办法
216
查看次数

禁用MATLAB的隐式扩展

最近,在R2016b中,一个功能被添加到MATLAB中,这在我教的学校引起了很多麻烦.

如今,传统上被视为非法或至少是阴暗数学的公式成功执行:

[1, 2] + [3, 4]'    -> [4, 5; 5, 6]
[1, 2]' + [3, 4, 5] -> [4, 5, 6; 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

因此,将行向量添加到列向量被视为两个矩阵的相加,从重复向量到"合适"维度可以得到两个矩阵.在旧版本中,这将产生错误消息,通知不可能添加具有不同尺寸的矩阵.

我想问为什么有点宽泛,虽然如果你知道为什么,我很想知道.相反,我会问,有没有办法禁用此功能?对于新手程序员来说,当传统的数学似乎没有排成一行时,这是一个受到伤害的世界,结果矩阵经常被忽视,导致错误只会在以后发生.

我不认为这是MATLAB语法和行为的有用部分,因为它需要太多的解释,阅读程序员的意图.repmat是有原因的,可以引入一个专门的功能来满足这个东西的需要.

matlab vector addition

4
推荐指数
2
解决办法
380
查看次数