有没有办法通过使矢量重复来扩展矢量?
>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中学习有效编程的第一件事就是避免动态调整数组大小.标准示例如下.
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) 我已经注意到很多关于SO的问题,但没有一个很好的MATLAB优化指南.
常见问题:
我不认为这些问题会停止,但我希望这里提出的想法能让他们集中参考.
优化Matlab代码是一种黑色艺术,总有一种更好的方法.有时甚至无法对代码进行矢量化.
所以我的问题是:当矢量化不可能或极其复杂时,优化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)
我没有完全按照文档中的示例进行操作.
Matlab描述nanmin并nanmax喜欢这样:
NANMIN最小值,忽略NaNs.
NANMAX最大值,忽略NaNs.
但实际上,min也max忽略了NaNs.
我应该使用哪个?
根据我的测试,nanmin并且nanmax更快.这总是这样吗?
我在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相同.
运行此代码:
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%他们做了什么,但有没有更好的方法来了解调整大小是如何完成的?上面的代码不是估计这个的好方法吗?
我想要乘以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)
如何加快这个操作?
在循环的每次迭代中,我正在计算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) 使用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中声明一个数组而不指定大小,就像std::vector在C++中一样,然后我想把元素"推"到数组中.我怎样才能声明这个数组并推送它?
我想在循环中为矩阵分配一些值,但我不知道有多少.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似乎在每次循环迭代中改变大小.
matlab ×12
matrix ×4
arrays ×3
performance ×3
octave ×2
allocation ×1
loops ×1
memory ×1
optimization ×1
variables ×1
vector ×1