matlab 向量的复制,MATLAB:复制向量’n’次
本问题已经有最佳答案,请猛点这里访问。
我有一个向量,例如
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’次相关推荐
- matlab 向量去除空格,MATLAB向量
行向量 列向量 MATLAB 行向量: 创建行向量括在方括号中的元素的集合,用空格或逗号分隔的元素.r = [7 8 9 10 11] 执行上述语句,返回下述结果:r = Columns 1 thro ...
- MATLAB的size()函数的返回值是一个1*2的向量哦,即使参数是向量也是1*2的向量哦!
MATLAB的size()函数的返回值是一个1*2的向量哦,即使参数是向量也是1*2的向量哦! 返回的向量第一个元素表示有多少行,第二个元素表示有多少列,如果size()的输入参数是一个向量,那么返回 ...
- matlab创建数组对象,MATLAB一维数组(向量)的定义
在 MATLAB 中,向量和矩阵主要是由数组表示的. 数组运算始终是 MATLAB 的核心内容,并且 MATLAB 区别于其他编程语言最大的优势就是数组计算.这种编程的优势使得计算程序简单.易读,程序 ...
- [Matlab] 无插件导入公式到 Word 中的方法:由 Matlab 导出 MathML 公式,复制到 Word 公式中
1.在 Matlab 实时脚本中输出结果 2.在实时脚本的输出框中复制 MathML 公式 3.粘贴到 Word 公式中 下图为对比图,由上到下为 复制图片 复制 Latex 公式并转换为专业型 复制 ...
- matlab计算两向量的乘积,matlab中两个函数相乘
变量名最多不超过63个字符; ? 变量名区分大小写; ? Matlab提供的标准函数名以及命令名必须用小写字母; ? 变量名中不能包含空格.标点.运算符. 1.变量及其...... 中的元素; (2) ...
- matlab 向量_COMSOL与MATLAB联合仿真+RBF神经网络预测输出
数值仿真软件 COMSOL 一是款功能强大的多物理场仿真软件,包含电磁学.流体流动等领域,可以解决电阻抗成像的正问题.这里简单给大家介绍一个电阻抗成像数值仿真的案例: 1. 首先,打开软件新建一个空白 ...
- matlab 向量变标量,MATLAB变量——标量,向量,矩阵
MATLAB变量--标量,向量,矩阵 MATLAB以NM×的形式保存了大量的矩阵,其中M是行数,N是列数.一个1×1矩阵是一个标量:1×N矩阵是一个行向量,,M×1矩阵是一个列向量.矩阵的全部元素可以 ...
- matlab 向量取倒数,Matlab 求倒数命令及控制方法
建立符号变量命令sym和syms调用格式: x=sym('x'), 建立符号变量x: syms x y z , 建立多个符号变量x,y,z: matlab求导命令diff调用格式: diff(函数) ...
- matlab中定义向量函数,matlab中如何定义向量
Matlab中生成向量的三种方法 在Matlab中,如何才能生成向量,生成向量的方法又有多少种?相信这是每一个初学者都想知道的问题.这里小编将向大家详细介绍Matlab中生成向量的三种方法. 方法一: ...
- matlab里的程序注释复制到word中时变成乱码
matlab里的程序注释复制到word中时变成乱码的解决办法 今天在复制matlab里的代码时发现注释都变成了乱码,碰巧手边打开了一个代码编辑器软件:notepad++. 自己尝试了一下先把Matla ...
最新文章
- Go 学习笔记(28)— nil(nil 不能比较、不是关键字或保留字、nil 没有默认类型、不同类型的 nil 指针是一样的、不同类型的 nil 是不能比较的、相同类型的 nil 可能也无法比较)
- 破解32位NT6内核系统(vista/win7 8G以上)的内存限制,完美支持4GB至128GB内存,全新教程!
- 电商后台:实例解读订单系统
- 30道最常问的Java基础面试题
- Android 使用Listview的优化
- 【CSS实现Loading遮罩】点击按钮,弹出一个DIV层窗口
- 代码视图与StoryBoard.Xib文件视图的跳转
- (计算机组成原理)第三章存储系统-第七节2:页式/段式虚拟存储器
- Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建
- java判断变量是奇书还是偶数_测试值是奇数还是偶数
- lambda qt 参数 槽函数_C++中的lambda表达式用法
- java开关语句_Java中嵌套开关语句的替代方法
- 矩阵的最大路径和问题
- mysql数据库库推荐书籍
- 在method方法被调用之后,仅打印出a=100,b=200,请写出method方法的代码
- 矩阵的矩阵指数函数_精通R编程:使用包,创建对象和基本矩阵函数
- webp格式以及工具介绍
- 申城一叙:SDCC 2017·上海站数据库专场讲师+议题抢鲜版纵览
- c语言解除键盘锁定,笔记本电脑解除键盘锁定的常见方法
- python 批量更改扩展名
热门文章
- win7全屏_微软重申将全屏通知敦促 Win 7 用户升级
- 重要的软件测试度量和度量指标(1)——附带例子和图表
- 关于使用LoadImage时的一个小错误(转)
- (Modern Family S01E02) Part 5 PhilClair Phil送Luke自行车
- [MIA2018-01]Segmenting Hippocampal Subfields from 3T MRI with Multi-modality Images
- 计算机毕业设计基于asp.net企业合同管理系统
- uniapp开发短视频系统仿哔哩哔哩
- 写高性能JavaScript
- 楼层布局图怎么做,简单的地图绘制软件
- 蓝牙模块:使用问题集锦