墨西哥人c++无法实现简单的算术运算,TypedArray std::复杂双> <

23日视图(30天)
我在墨西哥人一个c++函数来计算一些元素与复杂的矩阵值。我没有问题,当我用双代替std::复杂的< >的两倍。
复杂的版本如下:
#包括“mex.hpp”
#包括“mexAdapter.hpp”
#包括复杂> <
使用名称空间matlab:数据;
使用matlab:墨西哥人::ArgumentList;
MexFunction:公共matlab::墨西哥人:函数{
ArrayFactory工厂;
公众:
无效操作符()(ArgumentList输出,ArgumentList输入){
常量std::复杂的双> <我(0.0,1.0);/ /定义虚常数
常量TypedArray <双> R = std::移动(输入[0]);/ /输入(1 xn)进入一个TypedArray
TypedArray < std::复杂的<双> > U = factory.createArray < std::复杂的<双> > ({1,R.getDimensions () [1]});/ /创建一个复杂的数组大小相同
(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {U [0] [uind] = I + U [0] [uind];} / /没有工作
/ /(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {U [0] [uind] = +我;}/ /工作
输出[0]= std::移动(U);
}
};
编译失败,错误信息是更长的时间,我只在这里粘贴的beginnign可见性:
墨西哥人test_complex.cpp
建筑与“MinGW64编译器(c++)”。
错误使用墨西哥人
C: \ \墨西哥人\ test_complex数据。cpp:在成员“虚拟空白MexFunction:运营商()函数(matlab::墨西哥人::ArgumentList, matlab::墨西哥人::ArgumentList)”:
C: \ \墨西哥人\ test_complex数据。cpp: 17:75:错误:不匹配“运营商+”(操作数类型是‘const std::复杂的<双>
matlab::数据::ArrayElementTypedRef < <双> std::复杂,假>”)
(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {U [0] [uind] = I + U [0] [uind];} / /没有工作
文件包括C:\Program Files\MATLAB\ R2020b /走读生/ include / MatlabDataArray / matlab_data_array_defs.hpp: 6:0,
C:\Program Files\MATLAB\ R2020b /走读生/ include / MatlabDataArray.hpp: 7,
C:\Program Files\MATLAB\ R2020b /走读生/ include / mexAdapter.hpp: 10,
C: \ Data \墨西哥人\ test_complex.cpp: 3:
C: / ProgramData / MAT万博1manbetxLAB / SupportPackages R2020b / 3 p.instrset / mingw_w64.instrset / lib / gcc / x86_64-w64-mingw32/6.3.0 /包括/ c++ /复杂:445:5:注意:候选人:模板<类_Tp >
std::复杂的<_Tp > std::操作符+ (const std::复杂的<_Tp > &)
操作符+ (const复杂<_Tp > &__x)
^ ~ ~ ~ ~ ~ ~ ~
C: / ProgramData / MAT万博1manbetxLAB / SupportPackages R2020b / 3 p.instrset / mingw_w64.instrset / lib / gcc / x86_64-w64-mingw32/6.3.0 /包括/ c++ /复杂:445:5:注意:模板参数扣除/替换
失败:
C: \ \墨西哥人\ test_complex数据。cpp: 17:85:注意:候选人预计1参数2提供
(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {U [0] [uind] = I + U [0] [uind];} / /没有工作
使用+ =、* * =操作符返回类似错误。
奇怪的是相同的功能,而双值并返回任何问题和工作正常:
#包括“mex.hpp”
#包括“mexAdapter.hpp”
使用名称空间matlab:数据;
使用matlab:墨西哥人::ArgumentList;
MexFunction:公共matlab::墨西哥人:函数{
ArrayFactory工厂;
公众:
无效操作符()(ArgumentList输出,ArgumentList输入){
常量TypedArray <双> R = std::移动(输入[0]);
TypedArray <双> U = factory.createArray <双> ({1,R.getDimensions () [1]});
(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {U [0] [uind] = [0] [uind] + 1;}
输出[0]= std::移动(U);
}
};
> >墨西哥人test_real.cpp
建筑“MinGW64编译器(c++)”。
墨西哥人成功完成。
> > test_real (1:10)
ans =
1 1 1 1 1 1 1 1 1 1
1评论
里卡多。Scorretti
里卡多。Scorretti 2021年5月4日
非常感谢。事实上我有一个类似的问题,我通过使用铸造不设法解决。我想适应的例子 arrayProduct.cpp 以便它能适用于复杂的值。
我试着修改以后,但是我得到了下面的错误信息在运行时(没有预警的程序编译):
错误使用arrayProductComplex
不能把这个TypedArray数组
我想这是一个类似的问题。提示修复它吗?提前谢谢你
/ /
/ / arrayProduct。cpp -例子MATLAB外部接口
/ /
/ /(包括、注释等等)。
MexFunction:公共matlab::墨西哥人:函数{
公众:
无效操作符()(matlab::墨西哥人::ArgumentList输出,matlab::墨西哥人::ArgumentList输入){
checkArguments(输出,输入);
std::复杂的< >两倍乘数=输入[0][0];/ /到目前为止
/ /在这里我得到一个运行时错误
matlab::数据::TypedArray < std::复杂的<双> > = std::移动(输入[1]);
arrayProduct(乘数);
输出[0]= std::移动(的);
}
无效arrayProduct (matlab::数据::TypedArray < std::复杂的<双> > & inMatrix std::复杂的<双>乘数){
(汽车elem: inMatrix) {
初步的* =乘数;
}
}
/ /这里是checkArguments (modifid)方法
};

登录置评。

答案(1)

Aghamarsh瓦拉纳西
Aghamarsh瓦拉纳西 2021年4月21日
编辑:Aghamarsh瓦拉纳西 2021年4月21日
嗨,马修•迪普雷
二元运算符的 + “在” std::复杂的< T > “只是为添加类型定义 std::复杂的< T > ”或“标量”。在使用的 运营商[] matlab::数据::TypedArray < T > ”,返回类型是一个“ ArrayElementTypedRef”。 二进制“+”运算符是没有定义的 ArrayElementTypedRef” 在“ std::复杂的< T > “你收到这个错误。
为了克服这个问题,
  1. 你可以初始化”的价值U [0] [uind]”类型的一个变量的std::复杂的双> <”。因此,你的代码,
#包括“mex.hpp”
#包括“mexAdapter.hpp”
#包括复杂> <
使用名称空间matlab:数据;
使用matlab:墨西哥人::ArgumentList;
MexFunction:公共matlab::墨西哥人:函数{
ArrayFactory工厂;
公众:
无效操作符()(ArgumentList输出,ArgumentList输入){
常量std::复杂的双> <我(0.0,1.0);/ /定义虚常数
常量TypedArray <双> R = std::移动(输入[0]);/ /输入(1 xn)进入一个TypedArray
TypedArray < std::复杂的<双> > U = factory.createArray < std::复杂的<双> > ({1,R.getDimensions () [1]});/ /创建一个复杂的数组大小相同
/ /创建一个临时变量
std::复杂的<双> tmp;
(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {
/ /初始化U [0] [uind]tmp
tmp = U [0] [uind];
U [0] [uind] = I + tmp;} / /这样做工作! !
/ /(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {U [0] [uind] = +我;}/ /工作
输出[0]= std::移动(U);
}
2。或者,你可以铸型“U [0] [uind]”>“std::复杂的<双”。例如,
#包括“mex.hpp”
#包括“mexAdapter.hpp”
#包括复杂> <
使用名称空间matlab:数据;
使用matlab:墨西哥人::ArgumentList;
MexFunction:公共matlab::墨西哥人:函数{
ArrayFactory工厂;
公众:
无效操作符()(ArgumentList输出,ArgumentList输入){
常量std::复杂的双> <我(0.0,1.0);/ /定义虚常数
常量TypedArray <双> R = std::移动(输入[0]);/ /输入(1 xn)进入一个TypedArray
TypedArray < std::复杂的<双> > U = factory.createArray < std::复杂的<双> > ({1,R.getDimensions () [1]});/ /创建一个复杂的数组大小相同
(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {
U [0] [uind] = I + U (std::复杂的<二>)[0][uind];} / /这样做工作! !
/ /(size_t uind = 0;uind < U.getDimensions () [1]; uind + +) {U [0] [uind] = +我;}/ /工作
输出[0]= std::移动(U);
}
希望这有助于

类别

找到更多的在MATLAB c++数据API帮助中心文件交换

s manbetx 845


释放

R2020b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!