将Matlab中的矩阵运算转换为R代码

时间:2014-10-26 18:44:18

标签: r matlab matrix matrix-multiplication

我正在尝试将Matlab代码转换为R.我不熟悉Matlab矩阵运算,看来我的R代码的结果与Matlab的结果不匹配,所以任何帮助都会非常感激。我试图转换的Matlab代码低于(来自this website):

% Mean Variance Optimizer

% S is matrix of security covariances
S = [185 86.5 80 20; 86.5 196 76 13.5; 80 76 411 -19; 20 13.5 -19 25]

% Vector of security expected returns
zbar = [14; 12; 15; 7]

% Unity vector..must have same length as zbar
unity = ones(length(zbar),1)

% Vector of security standard deviations
stdevs = sqrt(diag(S))

% Calculate Efficient Frontier
A = unity'*S^-1*unity
B = unity'*S^-1*zbar
C = zbar'*S^-1*zbar
D = A*C-B^2

% Efficient Frontier
mu = (1:300)/10;

% Plot Efficient Frontier
minvar = ((A*mu.^2)-2*B*mu+C)/D;
minstd = sqrt(minvar);

plot(minstd,mu,stdevs,zbar,'*')
title('Efficient Frontier with Individual Securities','fontsize',18)
ylabel('Expected Return (%)','fontsize',18)
xlabel('Standard Deviation (%)','fontsize',18)

这是我在R中的尝试:

# S is matrix of security covariances
S <- matrix(c(185, 86.5, 80, 20, 86.5, 196, 76, 13.5, 80, 76, 411, -19, 20, 13.5, -19, 25), nrow=4, ncol=4, byrow=TRUE)

# Vector of security expected returns
zbar = c(14, 12, 15, 7)

# Unity vector..must have same length as zbar
unity <- rep(1, length(zbar))

# Vector of security standard deviations
stdevs <- sqrt(diag(S))

# Calculate Efficient Frontier
A <- unity*S^-1*unity
B <- unity*S^-1*zbar
C <- zbar*S^-1*zbar
D <- A*C-B^2

# Efficient Frontier
mu = (1:300)/10

# Plot Efficient Frontier
minvar = ((A*mu^2)-2*B*mu+C)/D
minstd = sqrt(minvar)

似乎Matlab中的unity*S等同于R中的colSums(S)但是我无法弄清楚如何计算R中S^-1*unity的等价物。如果我在R(S^-1*unity)中输入这个Matlab代码,它计算没有错误,但它给出了不同的答案。因为我不了解底层的Matlab计算,所以我不确定如何将其转换为R。

1 个答案:

答案 0 :(得分:2)

我曾经做过matlab - &gt;几年前R转换了很多次。

我的一般建议是并排打开2个终端,并尝试逐行完成所有操作。然后在每一行之后你应该检查你在MATLAB和R中得到的东西是否相同。

这个文件应该很方便:http://mathesaurus.sourceforge.net/octave-r.html

在您的情况下,这些似乎是您应该记住的命令:

矩阵乘法:

Matlab: A*B
R: A %*% B

移调:

Matlab: A'
R: t(A)

矩阵逆:

Matlab: inv(A) or A^-1
R: solve(A)

不要试图一次转换所有内容,因为你会遇到麻烦。如果结果不匹配,您将无法确定错误的位置。