例如,您可以对矢量中的每个项目应用函数,例如,v + 1
,或者您可以使用函数arrayfun
。如何在不使用for循环的情况下为矩阵的每一行/列做到这一点?如何将函数应用于MATLAB中矩阵的每一行/列?
回答
许多内置操作如sum
和prod
已能够跨行或列操作,因此您可以重构正在应用的函数以利用此功能。
如果这不是一个可行的选择,一分做它用mat2cell
或num2cell
收集行或列进入细胞,然后使用cellfun
所得到的单元阵列上运行的方式。
作为一个例子,假设您想对矩阵的列进行求和M
。为此,您可以简单地使用sum
:
M = magic(10); %# A 10-by-10 matrix
columnSums = sum(M, 1); %# A 1-by-10 vector of sums for each column
这里是你将如何使用更复杂的num2cell
/cellfun
选项做到这一点:
M = magic(10); %# A 10-by-10 matrix
C = num2cell(M, 1); %# Collect the columns into cells
columnSums = cellfun(@sum, C); %# A 1-by-10 vector of sums for each cell
就这个问题/答案迷迷糊糊的,同时寻求如何计算矩阵的行和。
我只想补充一点,Matlab的SUM函数实际上支持对给定维度进行求和,即具有两个维度的标准矩阵。
所以计算列总和做到:
colsum = sum(M) % or sum(M, 1)
与该行资金,根本就
rowsum = sum(M, 2)
我敢打赌,这是快于既为循环编程并转换到细胞:)
所有这一切都可以在MATLAB的MATLAB帮助中找到。
我不能就如何高效,这是的,但在这里评论的一个解决方案:
applyToGivenRow = @(func, matrix) @(row) func(matrix(row, :))
applyToRows = @(func, matrix) arrayfun(applyToGivenRow(func, matrix), 1:size(matrix,1))'
% Example
myMx = [1 2 3; 4 5 6; 7 8 9];
myFunc = @sum;
applyToRows(myFunc, myMx)
给出一个更通用的答案[这里](http://stackoverflow.com/a/15971182/376454)。 – Wok 2013-04-12 12:28:31
大厦Alex's answer,这里是一个比较通用的功能:
applyToGivenRow = @(func, matrix) @(row) func(matrix(row, :));
newApplyToRows = @(func, matrix) arrayfun(applyToGivenRow(func, matrix), 1:size(matrix,1), 'UniformOutput', false)';
takeAll = @(x) reshape([x{:}], size(x{1},2), size(x,1))';
genericApplyToRows = @(func, matrix) takeAll(newApplyToRows(func, matrix));
这里的比较这两个函数:
>> % Example
myMx = [1 2 3; 4 5 6; 7 8 9];
myFunc = @(x) [mean(x), std(x), sum(x), length(x)];
>> genericApplyToRows(myFunc, myMx)
ans =
2 1 6 3
5 1 15 3
8 1 24 3
>> applyToRows(myFunc, myMx)
??? Error using ==> arrayfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
Error in ==> @(func,matrix)arrayfun(applyToGivenRow(func,matrix),1:size(matrix,1))'
你可能想要更晦涩的Matlab函数bsxfun。从Matlab文档中,bsxfun“将由函数handle fun指定的逐个元素的二进制操作应用于数组A和B,并启用单例扩展。”
@gnovice上面陈述的是,sum和其他基本函数已经在第一个非单实体维度上操作(即,如果有多行,行如果只有一行,则列;或者如果较低维度都具有更高维度大小== 1)。但是,bsxfun适用于任何函数,包括(特别是)用户定义的函数。
例如,假设你有一个矩阵A和行向量求,让我们说:
A = [1 2 3;
4 5 6;
7 8 9]
B = [0 1 2]
你想要的功能power_by_col它在一个载体下,在所有元素返回的力量B.
从上面的例子中的相应列中,C是一个3×3矩阵:
C = [1^0 2^1 3^2;
4^0 5^1 6^2;
7^0 8^1 9^2]
即
C = [1 2 9;
1 5 36;
1 8 81]
你能做到这一点的强制方法使用repmat:
C = A.^repmat(B, size(A, 1), 1)
或者你可以使用bsxfun,在内部采取repmat步骤护理做到这一点优雅的方式:
C = bsxfun(@(x,y) x.^y, A, B)
所以bsxfun为您节省了一些步骤(您不需要明确计算A的尺寸)。然而,在我的一些非正式测试中,事实证明,如果要应用的功能(如上面的功率函数)很简单,repmat的速度大概是它的两倍。所以你需要选择你是想要简单还是速度。
接受的答案似乎是首先转换为单元格,然后使用cellfun
来操作所有单元格。我不知道具体的应用,但总的来说,我认为使用bsxfun
在矩阵上运行会更有效率。基本上bsxfun
跨两个数组应用一个元素操作。所以,如果你想通过每个项目在m x 1
向量乘在n x 1
向量中的每个项目获得的n x m
数组,你可以使用:
vec1 = [ stuff ]; % n x 1 vector
vec2 = [ stuff ]; $ m x 1 vector
result = bsxfun('times', vec1.', vec2);
这会给你一个矩阵称为result
其中(I,J)入口将是vec1
的第i个元素乘以vec2
的第j个元素。
对于各种内置函数,您可以使用bsxfun
,并且您可以声明自己的函数。该文档包含许多内置函数的列表,但基本上可以将任何接受两个数组(矢量或矩阵)的函数命名为参数并使其起作用。
,如果你知道你行的长度可以让这样的事情:
a=rand(9,3);
b=rand(9,3);
arrayfun(@(x1,x2,y1,y2,z1,z2) line([x1,x2],[y1,y2],[z1,z2]) , a(:,1),b(:,1),a(:,2),b(:,2),a(:,3),b(:,3))
对于看到这个答案的人:这不是做这件事的方法!这不是在MATLAB中做任何事情的方法! – 2016-08-10 12:12:06
对于完整性/利益,我想补充一点,MATLAB确实有一个功能,可以让您在每一个数据操作而不是每个元素。它被称为rowfun
(http://www.mathworks.se/help/matlab/ref/rowfun.html),但唯一的“问题”是它在表(http://www.mathworks.se/help/matlab/ref/table.html)上操作,而不是矩阵。
使用最新版本的Matlab,您可以使用Table数据结构来获得优势。甚至还有一个“rowfun”操作,但我发现它只是更容易做到这一点:
a = magic(6);
incrementRow = cell2mat(cellfun(@(x) x+1,table2cell(table(a)),'UniformOutput',0))
或这里的一老一我不需要表,为老年人Matlab的版本。
dataBinner = cell2mat(arrayfun(@(x) Binner(a(x,:),2)',1:size(a,1),'UniformOutput',0)')
添加到答案的性质演变到这个问题,开始r2016b,MATLAB会隐扩大单维度,在许多情况下不再需要为bsxfun
。
隐扩展:应用逐元素的操作和功能与长度的尺寸自动膨胀到阵列1
隐膨胀是标量膨胀的概括。通过标量扩展,标量扩展为与另一个 数组相同的尺寸,以便于元素操作。通过隐式扩展,只要数组具有 兼容大小,这里列出的按元素运算符和函数就可以隐式地将其输入扩展为相同大小。如果对于每个维度,输入的维度大小相同,或者其中一个维度大小为 ,则两个阵列具有兼容的大小。有关更多信息,请参阅基本操作的兼容阵列大小和 阵列与矩阵运算。
Element-wise arithmetic operators — +, -, .*, .^, ./, .\ Relational operators — <, <=, >, >=, ==, ~= Logical operators — &, |, xor Bit-wise functions — bitand, bitor, bitxor Elementary math functions — max, min, mod, rem, hypot, atan2, atan2d
例如,可以计算各列的均值以矩阵A, 然后从每一列与减去平均值的矢量A - 平均值(A)。
此前,此功能可通过bsxfun函数获得。 现在建议您将大多数使用bsxfun的调用替换为直接调用 调用支持隐式扩展的函数和运算符。 与使用bsxfun相比,隐式扩展提供更快的速度,更好的内存使用以及更高的代码可读性。
上述答案的工作“开箱即用”对我来说,但是,下面的函数,通过复制其他答案的想法得到工作:
apply_func_2_cols = @(f,M) cell2mat(cellfun(f,num2cell(M,1), 'UniformOutput',0));
它需要一个功能f
并将其应用于矩阵M
的每一列。
因此,例如:
f = @(v) [0 1;1 0]*v + [0 0.1]';
apply_func_2_cols(f,[0 0 1 1;0 1 0 1])
ans =
0.00000 1.00000 0.00000 1.00000
0.10000 0.10000 1.10000 1.10000
- 1. 将函数应用于matlab单元阵列中的矩阵的每一列
- 2. 如何将matlab拟合函数应用于矩阵的每一行
- 3. MatLab - 对矩阵中的每一行应用一个函数
- 4. 将函数应用于矩阵或数据帧的每一行
- 5. TensorFlow将函数应用于矩阵变量的每一行
- 6. 如何在MATLAB中将函数应用于矩阵?
- 7. 将索引函数应用于矩阵行中的每个值
- 8. 如何将函数应用于矩阵中的所有行?
- 9. 如何将矩阵的每一行乘以matlab中另一个矩阵的对应列?
- 10. 如何按列将函数应用于矩阵列表
- 11. 将repmat应用于Matlab中具有不同输入的矩阵的每一行
- 12. 如何将随机数应用于矩阵中的每个单元格 - Matlab
- 13. 如何将函数应用于numpy矩阵的所有列?
- 14. Python Numpy将旋转矩阵应用于阵列中的每一行
- 15. 使用矩阵的每一行中的元素应用函数
- 16. 如何让MATLAB为矩阵中的每列运行我的函数?
- 17. 在Matlab中对矩阵的每个元素应用函数
- 18. 将函数应用于Matlab中两个矩阵之间的所有列对
- 19. 如何使用Matlab将矩阵中的每n行平坦化?
- 20. 如何将每行与matlab中另一个矩阵元素的每行相乘?
- 21. 将矩阵中的每列乘以另一个矩阵中的相应行,并在Matlab中求和结果
- 22. 如何将函数应用于R中的矩阵
- 23. 如何将列矩阵转换为行矩阵在MATLAB
- 24. 将传递函数应用于矩阵的每个元素
- 25. 将函数应用于矩阵
- 26. 如何有效地将矩阵变换应用于NumPy数组的每一行?
- 27. 应用一个矩阵的每一行用于polyroot中的R
- 28. Matlab:复制矩阵的每一行
- 29. 如何将函数应用到矩阵的每一行并获取较大的矩阵
- 30. 如何将不同的函数应用于列表中每个矩阵的不同行?
我将测试该方法的性能针对简单for循环任何特定的情况下,这可能会更快然后转换矩阵单元阵列。使用tic/tac wrap来测试。 – yuk 2010-02-21 23:13:03
@yuk:我认为你的意思是“tic/toc”。 ;) – gnovice 2010-02-22 05:43:43
哎呀,当然!只是在滴答...... :) – yuk 2010-02-22 15:05:29