在MATLAB中,给定矩阵A
,我想创建一个矩阵B
,其中包含矩阵A
的元素,占第一列元素的百分比。以下代码执行此操作:
A = randi(5,6);
B = zeros(size(A,1), size(A,2));
for kk = 1:size(A,2)
B(:,kk) = (A(:,kk).*100)./ A(:,1)-100;
end
但是,如何通过矢量化在单行中实现相同的结果? arrayfun
会对此事有用吗?
答案 0 :(得分:5)
在这种情况下使用bsxfun
:
B = bsxfun(@rdivide, 100 * A, A(:, 1)) - 100;
您的代码正在做的是获取矩阵A
的每一列并除以其第一列。您正在进行一些额外的缩放,例如在分割之前将所有列乘以100,然后再减去。 bsxfun
在内部执行广播,这意味着它将临时创建一个新矩阵,该列表与A
中的列数重复第一列,并执行逐元素划分。您可以通过将矩阵预缩放100,然后在之后减去100来完成逻辑。
使用MATLAB R2016b,不需要bsxfun
,您可以使用算术运算本地执行此操作:
B = (100 * A) ./ A(:,1) - 100;