gpt4 book ai didi

arrays - Matlab:创建行为相同向量的矩阵。使用 repmat() 或乘以 ones()

转载 作者:太空宇宙 更新时间:2023-11-03 20:11:38 24 4
gpt4 key购买 nike

我想通过将向量自身连接 n 次来从向量创建矩阵。因此,如果我的向量是 mx1,那么我的矩阵将为 mxn,矩阵的每一列都将等于该向量。

以下哪项是最好/正确的方法,或者我不知道有更好的方法?

matrix = repmat(vector, 1, n);
matrix = vector * ones(1, n);

谢谢

最佳答案

这是使用 timeit 进行的一些基准测试具有不同的向量大小重复因子。要显示的结果适用于 Windows 上的 Matlab R2015b。

首先为每个考虑的方法定义一个函数:

%// repmat approach
function matrix = f_repmat(vector, n)
matrix = repmat(vector, 1, n);

%// multiply approach
function matrix = f_multiply(vector, n)
matrix = vector * ones(1, n);

%// indexing approach
function matrix = f_indexing(vector,n)
matrix = vector(:,ones(1,n));

然后生成不同大小的向量,并使用不同的重复因子:

M = round(logspace(2,4,15)); %// vector sizes
N = round(logspace(2,3,15)); %// repetition factors
time_repmat = NaN(numel(M), numel(N)); %// preallocate results
time_multiply = NaN(numel(M), numel(N));
time_indexing = NaN(numel(M), numel(N));
for ind_m = 1:numel(M);
for ind_n = 1:numel(N);
vector = (1:M(ind_m)).';
n = N(ind_n);
time_repmat(ind_m, ind_n) = timeit(@() f_repmat(vector, n)); %// measure time
time_multiply(ind_m, ind_n) = timeit(@() f_multiply(vector, n));
time_indexing(ind_m, ind_n) = timeit(@() f_indexing(vector, n));
end
end

结果绘制在以下两个图中,使用repmat作为引用:

figure
imagesc(time_multiply./time_repmat)
set(gca, 'xtick',1:2:numel(N), 'xticklabels',N(1:2:end))
set(gca, 'ytick',1:2:numel(M), 'yticklabels',M(1:2:end))
title('Time of multiply / time of repmat')
axis image
colorbar

figure
imagesc(time_indexing./time_repmat)
set(gca, 'xtick',1:2:numel(N), 'xticklabels',N(1:2:end))
set(gca, 'ytick',1:2:numel(M), 'yticklabels',M(1:2:end))
title('Time of indexing / time of repmat')
axis image
colorbar

enter image description here enter image description here

也许更好的比较是针对每个测试的向量大小和重复因子,三种方法中哪一种最快:

figure
times = cat(3, time_repmat, time_multiply, time_indexing);
[~, fastest] = min(times, [], 3);
imagesc(fastest)
set(gca, 'xtick',1:2:numel(N), 'xticklabels',N(1:2:end))
set(gca, 'ytick',1:2:numel(M), 'yticklabels',M(1:2:end))
title('1: repmat is fastest; 2: multiply is; 3: indexing is')
axis image
colorbar

enter image description here

从图中可以得出一些结论:

  • 基于乘法的方法总是比 repmat
  • 基于索引的方法类似于repmat。对于向量大小或重复因子的大值,它往往更快,而对于小值,它往往更慢。

关于arrays - Matlab:创建行为相同向量的矩阵。使用 repmat() 或乘以 ones(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32797649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com