Matrix inverse in objective function

Hi,
I am trying to find the matrix X, which minimizes the objective function. However, I see the following error:
Error using inv
Invalid data type. Input matrix must be double or single.
Error in t2 (line 11)
prob.Objective=trace(R - R*X'*inv(X*R*X' + sigma2*eye(T))*X*R);
My code snippet: (Here, T, N and sigma2 are constants and R is an NxN PSD matrix)
prob=optimproblem("Description","MSE min")
X=optimvar("X",T,N,"Type",'continuous');
prob.Objective=trace(R - R*X'*inv(X*R*X' + sigma2*eye(T))*X*R);

5 件のコメント

Rik
Rik 2023 年 11 月 17 日
Can you edit your question to provide example variables that will reproduce the error? You can use the run button to run the code in the editor.
Brahmadev
Brahmadev 2023 年 11 月 17 日
Hi, I was trying to reproduce this error and I used the following code below.
% Set the dimensions
T = 5;
N = 4;
% Generate a random value for sigma2
sigma2 = rand;
% Generate a random NxN PSD matrix for R
R = rand(N, N);
R = R'*R; % This ensures that R is positive semi-definite
prob=optimproblem("Description","MSE min");
X=optimvar("X",T,N,"Type",'continuous')
X =
5×4 OptimizationVariable array with properties: Array-wide properties: Name: 'X' Type: 'continuous' IndexNames: {{} {}} Elementwise properties: LowerBound: [5×4 double] UpperBound: [5×4 double] See variables with show. See bounds with showbounds.
prob.Objective=trace(R - R*X'*inv(X*R*X' + sigma2*eye(T))*X*R);
Error using inv
Invalid data type. Input matrix must be double or single.
In your case, the expression X*R*X' + sigma2*eye(T) is not a double or single matrix, it's an optimization expression, because "X" is an optimization variable. The inv function cannot handle optimization expressions, hence the error. You might need to reconsider the formulation of your problem without the use of 'inv'
Sai Srikar
Sai Srikar 2023 年 11 月 17 日
編集済み: Sai Srikar 2023 年 11 月 17 日
Hi @Rik, Brahmadev has provided the code with some example variables
Hi @Brahmadev, Can you suggest some way which helps me get rid of this error? My objective function and its optimal solution were discussed in an IEEE paper. I am trying to reproduce the same result using MATLAB's optimization toolbox.
Walter Roberson
Walter Roberson 2023 年 11 月 17 日
Do not use inv() here. Use the \ operator
Sai Srikar
Sai Srikar 2023 年 11 月 17 日
Hi, I tried \ operator like: prob.Objective = trace(R - R*X'*(X*R*X' + sigma2*eye(T))/(X*R)). I still get an error as follows:
Error using /
Division of an OptimizationVariable by nonscalar not supported.

サインインしてコメントする。

 採用された回答

Bruno Luong
Bruno Luong 2023 年 11 月 17 日

0 投票

1 件のコメント

Sai Srikar
Sai Srikar 2023 年 11 月 17 日
編集済み: Sai Srikar 2023 年 11 月 17 日
Thanks Bruno, I am able to get rid of the error.

サインインしてコメントする。

その他の回答 (2 件)

Himanshu
Himanshu 2023 年 11 月 17 日

0 投票

Hey,
I understand that you are an encountering an error while running the given code snippet.
The error message indicates that the error occurs because the inv function is being called with inputs of invalid datatype. The inv function only accepts inputs of type double or single. In the given code,inv function is trying to operate on an expression involving an optimization variable (X), which is not of type double or single.
Please refer to the following documentation page for more information on the inv function:

1 件のコメント

Sai Srikar
Sai Srikar 2023 年 11 月 17 日
Thanks Himanshu. Is there any way to address this issue in MATLAB?, I do know the analytical solution for this optimization problem, I wanted to reproduce the same using MATALAB's optimization toolbox for my work.

サインインしてコメントする。

Pratyush
Pratyush 2023 年 11 月 17 日

0 投票

Hi Sai,
I understand that you are getting an error using the "inv" function.
The error you receive is because the "inv" function accepts matrix of data type single or double as argument, but it seems your "X*R*X' + sigma2*eye(T)" expression is not of the correct type.
To fix this issue, you can explicitly convert the matrix to the desired type using the "double" function. Try modifying the last line of your script to :
prob.Objective = trace(R - R*X'*inv(double(X*R*X' + sigma2*eye(T)))*X*R);

1 件のコメント

Sai Srikar
Sai Srikar 2023 年 11 月 17 日
Thanks Pratyush, I tried this. I get a new error: "Error using double
Conversion to double from optim.problemdef.OptimizationExpression is not possible."

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeLinear Programming and Mixed-Integer Linear Programming についてさらに検索

製品

リリース

R2023a

質問済み:

2023 年 11 月 17 日

編集済み:

2023 年 11 月 17 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by