我有一个矩阵 5 -by- 4 ,其元素是2个参数beta1
和beta2
的函数,每个都取50个值。
5 -by- 4 矩阵的格式为
for i=1:5
factors(i,:)= [1,...
1-exp(-terms(i)/beta1) /(terms(i)/beta1), ...
(1-exp(-terms(i)/beta1))/(terms(i)/beta1)-exp(-terms(i)/beta1), ...
(1-exp(-terms(i)/beta2))/(terms(i)/beta2)-exp(-terms(i)/beta2)];
end
我想创建一个更大的矩阵,其列包含50个 5 -by- 4 矩阵,其中beta1
和beta2
不同beta2
。这些行包含50个 5 -by- 4 矩阵,其中包含不同的beta1
和固定的d(n)
。因此,较大矩阵的尺寸 250 -by- 200 。
是否有可以帮助我的功能或循环?我已经坚持了很长时间。
答案 0 :(得分:0)
我假设您已经或可以编写一个接受两个参数并输出 5 -by- 4 矩阵的函数,即
function m = f(beta1, beta2) %// You must write f yourself. m is a 5-by-4 matrix
那么最简单的解决方案就是创建一个嵌套循环(当然要预先分配效率)。请注意,我还假设您知道如何更改beta1
和beta2
,并将这些内容放在 50 -by- 1 中自己的矢量B1
和B2
:
M = zeros(250,200);
b1 = 1;
for r = 1:5:(250-5)
b2 = 1;
for c = 1:4:(200-4)
M(r:r+4,c:c+3) = f(B1(b1), B2(b2));
b2 = b2+1;
end
b1 = b1+1;
end
答案 1 :(得分:0)
假设我的值取决于其他2个值。我可以编写一个函数来计算这个myfun = @(x,y) x + y
。我可以使用arrayfun或bsxfun等来快速计算所有x
和y
的值。
x = rand(1000,1);
y = rand(1000,1);
res = arrayfun(myfun, x, y);
在您的情况下,您需要提前定义terms
,然后根据需要更改beta1
和beta2
。需要注意的一点是,arrayfun希望所有变量都具有相同的大小,因此使用repmat或类似的方法来重塑beta1和beta2。例如
terms = 1:5;
i = 1:5;
myfun = @(beta1, beta2) [1, (1-exp(-terms(i)/beta1)/(terms(i)/beta1)), (1-exp(-terms(i)/beta1))/ (terms(i)/beta1)-exp(-terms(i)/beta1), (1-exp(-terms(i)/beta2))/(terms(i)/beta2)-exp(-terms(i)/beta2)];
beta1 = repmat(rand(1,1),1,5);
beta2 = repmat(rand(1,1),1,5);
results = arrayfun(myfun, beta1, beta2,i,'UniformOutput',0);
这个输出将是一个数组的单元格。我相信在引擎盖下,arrayfun只是一个循环,但它应该由MathWorks矢量化,所以它应该很快。
要创建不同的beta1和固定beta2,只需定义它们,因为beta1在向量的前半部分不同,并且在下半部分是固定的。例如:
beta1 = ones(250,1) * 10;
beta1(1:125) = 1:125;
等等。
答案 2 :(得分:0)
这是一个明确的例子,可以概括和验证,以便给出正确的结果。只需将m0的定义更改为5x4矩阵:
%define beta variables as parameter lists:
beta1 = linspace(10,40,4);
beta2 = linspace(1,4,4);
L1 = length(beta1);
L2 = length(beta2);
%define m0 as your 5x4 matrix:
m0 = @(b1,b2)[b1, b2, 0 ; 0, 0, 0];
m = zeros(size(m0(1,1)));
[nrows,ncols] = size(m);
for q1 = 1:L1
for q2 = 1:L2
rows = (1:nrows) + (q2-1)*nrows;
cols = (1:ncols) + (q1-1)*ncols;
m(rows,cols) = m0(beta1(q1),beta2(q2));
end
end
m0(10,1)
m