相关疑难解决方法(0)

Octave/Matlab:扩展一个向量使其重复的向量?

有没有办法通过使矢量重复来扩展矢量?

>v = [1 2];
>v10 = v x 5; %x represents some function. Something like "1 2" x 5 in perl
Run Code Online (Sandbox Code Playgroud)

然后v10将是:

>v10
     1 2 1 2 1 2 1 2 1 2
Run Code Online (Sandbox Code Playgroud)

这应该适用于一般情况,而不仅仅是[1 2]

matlab vector octave

91
推荐指数
2
解决办法
5万
查看次数

MATLAB中的高效数组预分配

在MATLAB中学习有效编程的第一件事就是避免动态调整数组大小.标准示例如下.

N = 1000;

% Method 0: Bad
clear a
for i=1:N
    a(i) = cos(i);
end

% Method 1: Better
clear a; a = zeros(N,1);
for i=1:N
    a(i) = cos(i)
end
Run Code Online (Sandbox Code Playgroud)

这里的'Bad'变量需要运行O(N^ 2)时间,因为它必须分配一个新数组并在循环的每次迭代中复制旧值.

调试时我自己的首选做法是分配一个数组NaN,更难以与有效值混淆0.

% Method 2: Easier to Debug
clear a; a = NaN(N,1);
for i=1:N
    a(i) = cos(i)
end
Run Code Online (Sandbox Code Playgroud)

然而,人们会天真地认为,一旦我们的代码被调试,我们就会浪费时间分配一个数组,然后用0或填充它NaN.如前所述在这里,你可以按如下也许创建一个未初始化数组

% Method 3 : Even Better?
clear a; a(N,1) = 0;
for i=1:N
    a(i) = cos(i); …
Run Code Online (Sandbox Code Playgroud)

matlab memory-management octave

11
推荐指数
2
解决办法
3958
查看次数

优化MATLAB代码指南

我已经注意到很多关于SO的问题,但没有一个很好的MATLAB优化指南.

常见问题:

  • 为我优化此代码
  • 我该如何对此进行矢量化?

我不认为这些问题会停止,但我希望这里提出的想法能让他们集中参考.

优化Matlab代码是一种黑色艺术,总有一种更好的方法.有时甚至无法对代码进行矢量化.

所以我的问题是:当矢量化不可能或极其复杂时,优化MATLAB代码的一些技巧和窍门是什么?此外,如果你有任何常见的矢量化技巧,我也不介意看到它们.

optimization matlab

8
推荐指数
1
解决办法
3721
查看次数

在Matlab中预分配数组?

我使用一个简单的for循环来裁剪大量图像,然后将它们存储在单元格数组中.我一直收到消息:

变量croppedSag似乎在每次循环迭代时改变大小.考虑预先分配速度.

我在MATLAB编写代码之前已经多次看过这个.我总是忽略它,并且好奇有多少预先分配将增加运行时间,如果我有10,000个图像或更大的数字?

另外,我已阅读有关在文档中预分配的内容,并说它zeros()可用于此目的.我如何将其用于下面的代码?

croppedSag = {};
for i = 1:sagNum
    croppedSag{end+1} = imcrop(SagArray{i},rect);
end
Run Code Online (Sandbox Code Playgroud)

我没有完全按照文档中的示例进行操作.

arrays matlab memory-management pre-allocation

7
推荐指数
1
解决办法
7979
查看次数

"min"和"nanmin"之间的区别是什么?Matlab中的`max`和`nanmax`?

Matlab描述nanminnanmax喜欢这样:

NANMIN最小值,忽略NaNs.

NANMAX最大值,忽略NaNs.

但实际上,minmax忽略了NaNs.

我应该使用哪个?

根据我的测试,nanmin并且nanmax更快.这总是这样吗?

matlab

7
推荐指数
1
解决办法
1185
查看次数

如何删除矩阵A的那些行,它们与Matlab中指定列中的矩阵B具有相等的值?

我在Matlab A和B中有两个矩阵,它们具有相同的列数但行数不同.B中的行数也小于A中的行数.B实际上是A的子集.

如何从A中有效地删除这些行,其中A的第1列和第2列中的值等于矩阵B的第1列和第2列中的值?

目前我正在这样做:

for k = 1:size(B, 1)
     A(find((A(:,1) == B(k,1) & A(:,2) == B(k,2))), :) = [];
end
Run Code Online (Sandbox Code Playgroud)

和Matlab抱怨这是低效的,我应该尝试使用any,但我不知道如何使用它any.有人可以帮我解决这个问题吗?=)

我试过这个,但它不起作用:

A(any(A(:,1) == B(:,1) & A(:,2) == B(:,2), 2), :) = [];
Run Code Online (Sandbox Code Playgroud)

它抱怨如下:

Error using  == 
Matrix dimensions must agree.
Run Code Online (Sandbox Code Playgroud)

我想要的例子:

在此输入图像描述

在此输入图像描述

结果中的AB表示从A中删除B行.与AC相同.

performance matlab matrix vectorization

5
推荐指数
1
解决办法
162
查看次数

Matlab使用什么算法动态调整向量和矩阵的大小?

运行此代码:

n = 5;
x = zeros(n, 1);
for ix=1:10
   x(ix) = rand();
   disp(getfield(whos('x'), 'bytes'))
end
Run Code Online (Sandbox Code Playgroud)

输出:

40
40
40
40
40
48
56
64
72
80
Run Code Online (Sandbox Code Playgroud)

这似乎表明,当Matlab调整矢量大小时,它会调整大小以使其具有所需的空间,而不是更多.所以,一次只有一个元素.

将此与Sun的Java Array实现中方法进行对比,后者分配了足够的空间,以便每次调整都不需要在初始边界之上的每个赋值上进行.显然,由于Matlab不是开源的,所以没有办法告诉100%他们做了什么,但有没有更好的方法来了解调整大小是如何完成的?上面的代码不是估计这个的好方法吗?

matlab memory-management matrix dynamic-arrays

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

为什么这种乘法很慢

我想要乘以2个矩阵.我需要逐个元素地将它们相乘.它们的大小是100x100.但为什么这个功能工作得很慢?大约2-3分钟.

for i=1:size(volumes,1)
  for j =1:size(volumes,2)
      ys(i,j) = volumes(i,j)*prices(i,j)

  end
end
Run Code Online (Sandbox Code Playgroud)

如何加快这个操作?

performance matlab matrix vectorization

3
推荐指数
1
解决办法
94
查看次数

MATLAB矩阵预分配比动态矩阵扩展慢

在循环的每次迭代中,我正在计算MATLAB矩阵.这些矩阵必须连接在一起以创建一个最终矩阵.在进入循环之前我知道这个最终矩阵的维数,所以我使用'零'函数预先分配矩阵比初始化一个空数组要快,然后在循环的每次迭代中简单地附加子数组.奇怪的是,当我预分配时,我的程序运行得慢得多.这是代码(只有第一行和最后一行不同):

这很慢:

w_cuda = zeros(w_rows, w_cols, f_cols);

for j=0:num_groups-1

    % gets # of rows & cols in W. The last group is a special
    % case because it may have fewer than max_row_size rows
    if (j == num_groups-1 && mod(w_rows, max_row_size) ~= 0)
        num_rows_sub = w_rows - (max_row_size * j);    
    else
        num_rows_sub = max_row_size;
    end;

    % calculate correct W and f matrices
    start_index = (max_row_size * j) + 1;
    end_index = start_index + num_rows_sub - 1;

    w_sub = W(start_index:end_index,:);
    f_sub …
Run Code Online (Sandbox Code Playgroud)

memory arrays performance matlab memory-management

2
推荐指数
1
解决办法
1318
查看次数

在这种情况下如何删除预分配警告

使用for循环绘制一组图形时,例如:

for ei=1:length(E),
  hnds(ei) = plot(1:nP, avgR(ei,:), [clrStr(ei),'-'] ); 
end 
Run Code Online (Sandbox Code Playgroud)

hnds(ei)变量的代码中有一个(著名的)警告:

变量hnds(ei)似乎在每次循环迭代时都会更改大小。考虑预先分配速度。

但是,当我尝试预分配变量时:

hnds = zeros(1,length(E));
Run Code Online (Sandbox Code Playgroud)

此新行还有另一条警告,在预分配的详细信息中说:

建议的操作:避免将内存预先分配给分配给另一个函数输出的变量。

有什么办法可以消除此警告,还是应该忽略它?

matlab allocation

2
推荐指数
1
解决办法
1094
查看次数

如何在MATLAB中声明一个没有大小的数组?

我想在MATLAB中声明一个数组而不指定大小,就像std::vector在C++中一样,然后我想把元素"推"到数组中.我怎样才能声明这个数组并推送它?

arrays matlab

2
推荐指数
1
解决办法
2729
查看次数

当一个维度未知时,在循环之前定义矩阵

我想在循环中为矩阵分配一些值,但我不知道有多少.B是基于Data(i,:)循环内的数据集计算的向量.元素的数量B在循环内部是固定的,但事先是未知的.

它像是;

A = zeros(n,m) %// I know n but I do not know m
for i = 1 : n
    % some code to calculate B from Data(i,:)
    A(i,:) = B;
end
Run Code Online (Sandbox Code Playgroud)

B是一个向量,但我不知道length(B)在循环之前所以我不能将它分配给m.
初始化时A = [];,Matlab发出警告

A 似乎在每次循环迭代中改变大小.

variables matlab loops matrix

2
推荐指数
1
解决办法
2264
查看次数