当前位置: 首页 > 编程语言 > C#

适应二维情况的包装类分享

时间:2023-04-10 17:31:55 C#

适应二维情况的包装类这道题是这道题的延伸。我想使包装器适应2D案例。这是我第一次尝试:publicclassEmxArrayRealTWrapper:IDisposable{privatereadonlyemxArray_real_T_value;私有GCHandle_dataHandle;私有GCHandle_sizeHandle;publicemxArray_real_TValue{get{return_value;}}publicEmxArrayRealTWrapper(double[,]data){_dataHandle=GCHandle.Alloc(data,GCHandleType.Pinned);_value.data=_dataHandle.AddrOfPinnedObject();_sizeHandle=GCHandle.Alloc(newint[]{data.GetLength(0),data.GetLength(1)},GCHandleType.Pinned);_value.size=_sizeHandle.AddrOfPinnedObject();_value.allocatedSize=data.GetLength(0)*data.GetLength(1)*sizeof(double);_value.numDimensions=2;_value.canFreeData=false;}publicvoidDispose(){_dataHandle.Free();_sizeHandle.Free();GC.SuppressFinalize(这个);}~EmxArrayRealTWrapper(){Dispose();}}[StructLayout(LayoutKind.Sequential)]publicstructemxArray_real_T{publicIntPtr数据;公共IntPtr大小;公共int分配大小;publicintnumDimensions;[元帅As(UnmanagedType.U1)]publicboolcanFreeData;}PS:matlab原代码如下:function[x]=test(a)%#codegenx=0;如果(?isempty(coder.target))断言(isa(a,'double'));断言(所有(大小(a)==[1Inf]));结束x=总和(a);可以这样调用:a=[12;34]r=test(a)产生:r=46不幸的是,生成的C无法执行Matlab可以执行的操作(即返回数组):__declspec(dllexport)real_Ttest(constemxArray_real_T*a);real_Ttest(constemxArray_real_T*a){real_Tx;int32_Tk;如果(a->size[1]==0){x=0.0;}else{x=a->数据[0];for(k=2;ksize[1];k++){x+=a->data[k-1];}}返回x;我假设MATLAB数组结构使用col-major排序。在这种情况下,结构构造函数需要如下所示:publicEmxArrayRealTWrapper(double[,]data){intnRow=data.GetLength(0);intnCol=data.GetLength(1);double[]flattenedData=newdouble[nCol*nRow];整数索引=0;for(intcol=0;如果本机代码需要行优先,则col甚至更简单。AC#多维数组存储为连续的行优先数组。因此您可以使用与我最近的问题中提供的相同的一维该代码与代码非常相似。publicEmxArrayRealTWrapper(double[,]data){intnRow=data.GetLength(0);intnCol=data.GetLength(1);_dataHandle=GCHandle.Alloc(数据,GCHandleType.Pinned);_value.data=_dataHandle.AddrOfPinnedObject();_sizeHandle=GCHandle.Alloc(newint[]{nRow,nCol},GCHandleType.Pinned);_value.size=_sizeHandle.AddrOfPinnedObject();_value.allocatedSize=nCol*nRow;_value.numDimensions=2;_价值。可以自由数据=假;请注意,这两个变体在数据传递到本机代码的方式上有所不同。第一个版本传递原始数据的副本。第二个传递对原始数据的引用。我不确定您希望代码如何运行。调整第二个版本以传递副本很容易。对于第一个版本,如果您希望本机代码修改数据并将这些修改反映回托管代码,那么您需要在返回本机调用后重新编组这些修改。以上就是《C#学习教程:适配二维情况封装类》的全部内容。如果对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: