利用Matlab和VBA进行投资组合优化。cell2mat不';行不通

利用Matlab和VBA进行投资组合优化。cell2mat不';行不通,matlab,vba,Matlab,Vba,我正在尝试用VBA编写一个宏来执行MATLAB。打开时,MATLAB使用excel表格中存储的数据记录宏。因此,在VBA代码中,我调用了MATLAB函数,并使用cell2mat将数据从Excel转换为MATLAB。为了让我的生活更轻松,我将发布以下代码: Public Sub USA() Dim MatLab As Object Set MatLab = CreateObject("MatLab.Desktop.Application") MatLab.Execute ("cd('C:\User

我正在尝试用VBA编写一个宏来执行MATLAB。打开时,MATLAB使用excel表格中存储的数据记录宏。因此,在VBA代码中,我调用了MATLAB函数,并使用
cell2mat
将数据从Excel转换为MATLAB。为了让我的生活更轻松,我将发布以下代码:

Public Sub USA()
Dim MatLab As Object
Set MatLab = CreateObject("MatLab.Desktop.Application")
MatLab.Execute ("cd('C:\Users\Dales\Dropbox\Esempi')")
Serie = Sheets("SP500").Range("B3:RU686")
Grupposector = Sheets("GruppoT").Range("B3:RU21")
GruppoMin = Sheets("Gruppo").Range("Z11:Z29")
GruppoMax = Sheets("Gruppo").Range("AA11:AA29")
ris = MatLab.PutWorkspaceData("prices", "base", Serie)
ris = MatLab.PutWorkspaceData("Grupposector", "base", Grupposector)
ris = MatLab.PutWorkspaceData("GruppoMin", "base", GruppoMin)
ris = MatLab.PutWorkspaceData("GruppoMax", "base", GruppoMax)
myResult = MatLab.Execute("[PortRisk, PortReturn, PortWts] = obama( cell2mat(prices, cell2mat(Grupposector), cell2mat(GruppoMin), cell2mat(GruppoMax));")

ris = MatLab.GetWorkspaceData("PortRisk", "base", PortRisk)
ris = MatLab.GetWorkspaceData("PortReturn", "base", PortReturn)
ris = MatLab.GetWorkspaceData("PortWts", "base", PortWts)

Sheets("SPottimizzazione").Range("a3:a18") = PortRisk
Sheets("SPottimizzazione").Range("b3:b18") = PortReturn
Sheets("SPottimizzazione").Range("e3:rx18") = PortWts
End Sub
现在,当MATLAB被宏打开时,它不会将我的输入转换为双格式,而是将它们存储为字符串


我错在哪里

您的问题是,正如您所说,您的数据是作为字符串导入的。直接调用
cell2mat
将不起作用,因为它会将数据存储为
char

为了解决问题,您需要做的是将单元格数组中的每个单元格转换为双倍,然后再将单元格转换为矩阵

这可以通过调用以下命令来实现:

 myResult = MatLab.Execute("[PortRisk, PortReturn, PortWts] = obama(...
 cell2mat(cellfun(@str2double,prices,'UniformOutput',false)),... 
 cell2mat(cellfun(@str2double,Grupposector,'UniformOutput',false)),... 
 cell2mat(cellfun(@str2double,GruppoMin,'UniformOutput',false)),... 
 cell2mat(cellfun(@str2double,GruppoMax,'UniformOutput',false)));")

当然,如果您的
obama
函数需要双矩阵作为输入,这将起作用。

它不能解决问题。另外,这很奇怪,因为当我运行宏时,它会打开MatLab,但由于输入是作为字符串导入的,所以所有宏都会停止。然后,如果使用命令框将cell2mat应用于这些输入,它工作正常。等等,“输入作为字符串导入”是什么意思?例如,
prices
的确切结构是什么?行Serie=Sheets(“SP500”)。范围(“B3:RU686”)在excel表格上选择一个带有如下数字的范围:"8.7408 56.5172 57.9271 39.3975 8.6048 56.2593 57.4437 39.3621 8.6825 56.4067 58.6523 39.3975 8.7117 57.1987 59.7546 39.2118 8.6435 55.7528 59.9286 39.1853 8.7994 55.7252 60.1413 39.2914“范围内没有空格,也没有文本。请在MATLAB上运行命令
whos prices
,好吗?Name=prices Size=684x488 Bytes=40055040 Class=cell attributes我已在VBA代码中复制并粘贴了“myresult”(如您所写)。仍然不起作用。您的
obama
函数需要什么作为输入?函数[PortRisk,PortReturn,PortWts]=obama(prices,gruposector,GruppoMin,GruppoMax)我将重新表述:您的obama函数需要什么数据类型作为输入?我给您的代码将作为函数
obama
的输入,给出包含双精度的矩阵。如果这不是
obama
函数应该使用的功能,那么它不工作是正常的。。。