高分跪求一矩阵高效算法

写个昵称都这么麻烦 2012-08-14 10:00:04
好久没来了、求大牛!虽然是C++、懂的帮我下、感激!
看在大家同在一C#版块里、C++发帖石沈大海了
可以将我的方法转成指针
(此方法求一矩阵里的子矩阵)
	Matrix2D^ Matrix2DCalculator::SubMatrix(Matrix2D^ matrix,int row,int column,int rows,int columns){

int lie = matrix->Columns;
Matrix2D^ a = gcnew Matrix2D(rows,columns,0);
for(int i =row; i<rows+row; i++){
for(int j = column; j<columns+column; j++){
a->Elements[(i-row)*columns+(j-column)] = matrix->Elements[i*lie+j];
}
}
return a;
}

计算机中内存地址是一条直接排过去的、
上面这样需要定位到矩阵的几行几列、
效率低很多、想用指针直接指向内存地址、
for中也用指针递增、求大牛帮我换成指针
...全文
205 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2012-08-15
  • 打赏
  • 举报
回复
把你的API共享下吧,我需要看到它的定义,指针不能随便乱用的,必须清楚某个结构的内存分布才行,否则很危险。
  • 打赏
  • 举报
回复
API发下来就这样的、、只是在上面写代码、
这些我都不懂、没怎么学过C++
[Quote=引用 4 楼 的回复:]
这个和C#基本没区别,因为你是运行在.NET基础上的,用的C++/CLR,所以你去C++版区问,即使有人看到也没人有能力回答你,用C++的人,基本上不用C++/CLR,那个东西没有语法提示,没人去学,只有C#高手会反过来去学它,因为可以用它和其它C++进行互操作。
另外你的Matrix2D在哪里找的?在WPF的PresentationCore.dll 中有个Matrix3D,但没找到你的Matr……
[/Quote]
qldsrx 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

&可以取到那个元素的地址吧、没问题啊
[/Quote]
我写个标准的指针获取的函数给你看看:
generic <typename T> where T : value class
static T Read(array<Byte>^ data)
{
T value;
pin_ptr<System::Byte> src = &data[0];
pin_ptr<T> dst = &value;

memcpy((void*)dst, (void*)src,
/*System::Runtime::InteropServices::Marshal::SizeOf(T::typeid)*/
sizeof(T));

return value;
}

同样是用memcpy,但是要获取指针却不能直接用&,因为他们都是托管对象,托管对象的地址是不固定的,需要pin_ptr将内存地址固定后才能得到,否则编译的时候就要报错。
  • 打赏
  • 举报
回复
&可以取到那个元素的地址吧、没问题啊
  • 打赏
  • 举报
回复
我就一菜鸟、就会做做管理系统、其他的遇到才去查下资料
你说的pin_ptr我都不知道是什么
qldsrx 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

C/C++ code
#include <memory.h>
Matrix2D^ SubMatrix2(Matrix2D^ matrix,int row,int column,int rows,int columns){
int lie = matrix->Columns;
Matrix2D^ a = gcnew Matrix2D(rows,columns,0);
double……
[/Quote]

memcpy和指针操作是等效的,只不过因为不知道a->Elements可以直接转化为double *,所以我才要问你要数据定义,而且你这样写真的没问题吗?因为gc分配的内存是无法直接获取指针的,需要pin_ptr钉住才行。
  • 打赏
  • 举报
回复
#include <memory.h>
Matrix2D^ SubMatrix2(Matrix2D^ matrix,int row,int column,int rows,int columns){
int lie = matrix->Columns;
Matrix2D^ a = gcnew Matrix2D(rows,columns,0);
double * p = a->Elements;
double * p1 = &(matrix->Elements[row*lie+column]);
double * p2 = p1;
for(int i =0; i<rows; i++){
memcpy(p,p1,sizeof(double)*columns);
p = p + columns;
p1 = p2 + lie;
p2 = p1;
}
return a;
}
  • 打赏
  • 举报
回复
问题了解了、C++那边有人答了、
说用内存拷贝函数会快一点、
今天看了下memcpy、应该还不错、
  • 打赏
  • 举报
回复
、、、
这就是接口了、要我自己写功能
  • 打赏
  • 举报
回复
求来人、、、、mark
qldsrx 2012-08-14
  • 打赏
  • 举报
回复
这个和C#基本没区别,因为你是运行在.NET基础上的,用的C++/CLR,所以你去C++版区问,即使有人看到也没人有能力回答你,用C++的人,基本上不用C++/CLR,那个东西没有语法提示,没人去学,只有C#高手会反过来去学它,因为可以用它和其它C++进行互操作。
另外你的Matrix2D在哪里找的?在WPF的PresentationCore.dll 中有个Matrix3D,但没找到你的Matrix2D
Trent1985 2012-08-14
  • 打赏
  • 举报
回复
你的程序是WINRT里的吧...
  • 打赏
  • 举报
回复
没人么?不要又沉了啊

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧