本问题已经有最佳答案,请猛点这里访问。

我有一个向量,例如

vector = [1 2 3]

我想在自身内部重复n次,即如果n = 3,则最终结果为:

vector = [1 2 3 1 2 3 1 2 3]

对于任何n值,如何实现呢? 我知道我可以执行以下操作:

newvector = vector;

for i = 1 : n-1

newvector = [newvector vector];

end

不过,这似乎有点麻烦。 还有更有效的方法吗?

尝试

repmat([1 2 3],1,3)

我将让您检查repmat的文档。

这是比repmat或reshape快一个数量级的方法

进行此类操作的最佳方法之一是使用Tony's Trick。通常发现Repmat和Reshape比Tony的技巧要慢,因为它直接使用Matlabs固有的索引。为了回答您的问题,

假设您要像r=[1 2 3 1 2 3 1 2 3...]那样平铺行向量r=[1 2 3] N的时间,然后,

c=r'

cc=c(:,ones(N,1));

r_tiled = cc(:)';

对于大型N,此方法与reshape或repmat相比可节省大量时间。

编辑:回复@ Li-aung Yip的疑问

我进行了一个小型的Matlab测试,以检查repmat和tony's trick之间的速度差异。使用下面提到的代码,我计算了从基本向量A=[1:N]构造相同平铺向量的时间。结果表明,是的,托尼的绝技更快,尤其适用于较大的N。欢迎人们自己尝试一下。如果必须循环执行这种操作,那么这么多的时间差就很关键。这是我使用的小脚本;

N= 10 ;% ASLO Try for values N= 10, 100, 1000, 10000

% time for tony_trick

tic;

A=(1:N)';

B=A(:,ones(N,1));

C=B(:)';

t_tony=toc;

clearvars -except t_tony N

% time for repmat

tic;

A=(1:N);

B=repmat(A,1,N);

t_repmat=toc;

clearvars -except t_tony t_repmat N

两种方法的时间(以秒为单位)如下:

N = 10,time_repmat = 8e-5,time_tony = 3e-5

N = 100,time_repmat = 2.9e-4,time_tony = 6e-5

N = 1000,time_repmat = 0.0302,time_tony = 0.0058

N = 10000,time_repmat = 2.9199,time_tony = 0.5292

我的内存不允许我超过N = 10000。我相信,对于N = 100000,两种方法之间的时间差会更大。我知道,这些时间对于不同的机器可能会有所不同,但是时间顺序的相对差异将会存在。而且,我知道,平均时间本来可以是更好的指标,但是我只想显示两种方法之间在时间消耗上的数量级差异。我的机器/操作系统的详细信息如下:

相关机器/操作系统/ Matlab详细信息:Athlon i686 Arch,Ubuntu 11.04 32位,3GB内存,Matlab 2011b

首先;什么?!其次,人们想知道为什么repmat()比手动执行要慢。第三,任何使用此功能的人最好在其旁边添加评论。

在对Tonys Trick进行了一些研究之后,似乎在14年前撰写本文时速度更快。自那时以来,MATLAB已有了很大改进,Tonys Trick可能不再比repmat快。 (您应该编写一个基准并对此进行测试。))

会的,谢谢你的链接。

@ Li-aungYip是的,数学论坛上的发布日期是2010年12月13日。此外,回复您的早期评论:C是40年前编写的,这并不意味着它比Matlab要慢。不要依靠观点/当代传统智慧做出客观决定。

很好的答案:关于程序性能的陈述有证据支持。我在SO上看到很多关于程序性能的断言,很少有证据支持。我看不到自己经常使用Tonys Trick,但后来我并没有太多使用repmat,现在我知道如果发现repmat太慢,该去哪里找。

好吧,我该死。辛苦了:)

2018年更新我复制了上面的实验(一定要将您的代码计时到函数M文件中!),并使用repmat始终获得更快的结果。就是说,即使repmat已过时,我们已有bsxfun十多年了,现在却隐含了单例扩展。如今,repmat的合法用法很少而且相去甚远。

基于Abhinav的答案和一些测试,我编写了一个始终比repmat()快的函数!

它使用相同的参数,除了第一个参数必须是向量而不是矩阵。

function vec = repvec( vec, rows, cols )

%REPVEC Replicates a vector.

%   Replicates a vector rows times in dim1 and cols times in dim2.

%   Auto optimization included.

%   Faster than repmat()!!!

%

%   Copyright 2012 by Marcel Schnirring

if ~isscalar(rows) || ~isscalar(cols)

error('Rows and cols must be scaler')

end

if rows == 1 && cols == 1

return  % no modification needed

end

% check parameters

if size(vec,1) ~= 1 && size(vec,2) ~= 1

error('First parameter must be a vector but is a matrix or array')

end

% check type of vector (row/column vector)

if size(vec,1) == 1

% set flag

isrowvec = 1;

% swap rows and cols

tmp = rows;

rows = cols;

cols = tmp;

else

% set flag

isrowvec = 0;

end

% optimize code -> choose version

if rows == 1

version = 2;

else

version = 1;

end

% run replication

if version == 1

if isrowvec

% transform vector

vec = vec';

end

% replicate rows

if rows > 1

cc = vec(:,ones(1,rows));

vec = cc(:);

%indices = 1:length(vec);

%c = indices';

%cc = c(:,ones(rows,1));

%indices = cc(:);

%vec = vec(indices);

end

% replicate columns

if cols > 1

%vec = vec(:,ones(1,cols));

indices = (1:length(vec))';

indices = indices(:,ones(1,cols));

vec = vec(indices);

end

if isrowvec

% transform vector back

vec = vec';

end

elseif version == 2

% calculate indices

indices = (1:length(vec))';

% replicate rows

if rows > 1

c = indices(:,ones(rows,1));

indices = c(:);

end

% replicate columns

if cols > 1

indices = indices(:,ones(1,cols));

end

% transform index when row vector

if isrowvec

indices = indices';

end

% get vector based on indices

vec = vec(indices);

end

end

随时使用所有数据测试该功能,并给我反馈。当您发现可以改善的地方时,请告诉我。

总是更快?我们可以看到一些数字,跨平台/操作系统/矢量大小/等等吗?

matlab 向量的复制,MATLAB:复制向量’n’次相关推荐

  1. matlab 向量去除空格,MATLAB向量

    行向量 列向量 MATLAB 行向量: 创建行向量括在方括号中的元素的集合,用空格或逗号分隔的元素.r = [7 8 9 10 11] 执行上述语句,返回下述结果:r = Columns 1 thro ...

  2. MATLAB的size()函数的返回值是一个1*2的向量哦,即使参数是向量也是1*2的向量哦!

    MATLAB的size()函数的返回值是一个1*2的向量哦,即使参数是向量也是1*2的向量哦! 返回的向量第一个元素表示有多少行,第二个元素表示有多少列,如果size()的输入参数是一个向量,那么返回 ...

  3. matlab创建数组对象,MATLAB一维数组(向量)的定义

    在 MATLAB 中,向量和矩阵主要是由数组表示的. 数组运算始终是 MATLAB 的核心内容,并且 MATLAB 区别于其他编程语言最大的优势就是数组计算.这种编程的优势使得计算程序简单.易读,程序 ...

  4. [Matlab] 无插件导入公式到 Word 中的方法:由 Matlab 导出 MathML 公式,复制到 Word 公式中

    1.在 Matlab 实时脚本中输出结果 2.在实时脚本的输出框中复制 MathML 公式 3.粘贴到 Word 公式中 下图为对比图,由上到下为 复制图片 复制 Latex 公式并转换为专业型 复制 ...

  5. matlab计算两向量的乘积,matlab中两个函数相乘

    变量名最多不超过63个字符; ? 变量名区分大小写; ? Matlab提供的标准函数名以及命令名必须用小写字母; ? 变量名中不能包含空格.标点.运算符. 1.变量及其...... 中的元素; (2) ...

  6. matlab 向量_COMSOL与MATLAB联合仿真+RBF神经网络预测输出

    数值仿真软件 COMSOL 一是款功能强大的多物理场仿真软件,包含电磁学.流体流动等领域,可以解决电阻抗成像的正问题.这里简单给大家介绍一个电阻抗成像数值仿真的案例: 1. 首先,打开软件新建一个空白 ...

  7. matlab 向量变标量,MATLAB变量——标量,向量,矩阵

    MATLAB变量--标量,向量,矩阵 MATLAB以NM×的形式保存了大量的矩阵,其中M是行数,N是列数.一个1×1矩阵是一个标量:1×N矩阵是一个行向量,,M×1矩阵是一个列向量.矩阵的全部元素可以 ...

  8. matlab 向量取倒数,Matlab 求倒数命令及控制方法

    建立符号变量命令sym和syms调用格式: x=sym('x'), 建立符号变量x: syms x y z , 建立多个符号变量x,y,z: matlab求导命令diff调用格式: diff(函数) ...

  9. matlab中定义向量函数,matlab中如何定义向量

    Matlab中生成向量的三种方法 在Matlab中,如何才能生成向量,生成向量的方法又有多少种?相信这是每一个初学者都想知道的问题.这里小编将向大家详细介绍Matlab中生成向量的三种方法. 方法一: ...

  10. matlab里的程序注释复制到word中时变成乱码

    matlab里的程序注释复制到word中时变成乱码的解决办法 今天在复制matlab里的代码时发现注释都变成了乱码,碰巧手边打开了一个代码编辑器软件:notepad++. 自己尝试了一下先把Matla ...

最新文章

  1. Go 学习笔记(28)— nil(nil 不能比较、不是关键字或保留字、nil 没有默认类型、不同类型的 nil 指针是一样的、不同类型的 nil 是不能比较的、相同类型的 nil 可能也无法比较)
  2. 破解32位NT6内核系统(vista/win7 8G以上)的内存限制,完美支持4GB至128GB内存,全新教程!
  3. 电商后台:实例解读订单系统
  4. 30道最常问的Java基础面试题
  5. Android 使用Listview的优化
  6. 【CSS实现Loading遮罩】点击按钮,弹出一个DIV层窗口
  7. 代码视图与StoryBoard.Xib文件视图的跳转
  8. (计算机组成原理)第三章存储系统-第七节2:页式/段式虚拟存储器
  9. Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建
  10. java判断变量是奇书还是偶数_测试值是奇数还是偶数
  11. lambda qt 参数 槽函数_C++中的lambda表达式用法
  12. java开关语句_Java中嵌套开关语句的替代方法
  13. 矩阵的最大路径和问题
  14. mysql数据库库推荐书籍
  15. 在method方法被调用之后,仅打印出a=100,b=200,请写出method方法的代码
  16. 矩阵的矩阵指数函数_精通R编程:使用包,创建对象和基本矩阵函数
  17. webp格式以及工具介绍
  18. 申城一叙:SDCC 2017·上海站数据库专场讲师+议题抢鲜版纵览
  19. c语言解除键盘锁定,笔记本电脑解除键盘锁定的常见方法
  20. python 批量更改扩展名

热门文章

  1. win7全屏_微软重申将全屏通知敦促 Win 7 用户升级
  2. 重要的软件测试度量和度量指标(1)——附带例子和图表
  3. 关于使用LoadImage时的一个小错误(转)
  4. (Modern Family S01E02) Part 5  PhilClair  Phil送Luke自行车
  5. [MIA2018-01]Segmenting Hippocampal Subfields from 3T MRI with Multi-modality Images
  6. 计算机毕业设计基于asp.net企业合同管理系统
  7. uniapp开发短视频系统仿哔哩哔哩
  8. 写高性能JavaScript
  9. 楼层布局图怎么做,简单的地图绘制软件
  10. 蓝牙模块:使用问题集锦