资源简介
这是一个基于 C++的HOSVD源代码,经过测试,不过只能分解3阶张量
代码片段和文件信息
#include “StdAfx.h“
#include “HOSVD.h“
#include
#include “math.h“
CHOSVD::CHOSVD(void)
{
}
CHOSVD::~CHOSVD(void)
{
}
inline void* CHOSVD::AlignPtr( const void* ptr int align=32 )
{
// assert( (align & (align-1)) == 0 );
return (void*)( ((size_t)ptr + align - 1) & ~(size_t)(align-1) );
}
inline int CHOSVD::Align( int size int align )
{
// assert( (align & (align-1)) == 0 && size < INT_MAX );
return (size + align - 1) & -align;
}
Matrix* CHOSVD::CreateMatHeader( int rows int cols int type )
{
Matrix* arr = 0;
int min_step;
type = MAT_TYPE(type);
min_step = ELEM_SIZE(type)*cols;
arr = (Matrix*)malloc( sizeof(*arr));
arr->step = rows == 1 ? 0 : Align(min_step DEFAULT_MAT_ROW_ALIGN);
arr->type = MAT_MAGIC_VAL | type |
(arr->step == 0 || arr->step == min_step ? MAT_CONT_FLAG : 0);
arr->rows = rows;
arr->cols = cols;
arr->data.ptr = 0;
arr->refcount = 0;
arr->hdr_refcount = 1;
return arr;
}
void CHOSVD::CreateData( CvArr* arr )
{
//if( CV_IS_MAT_HDR( arr ))
//{
size_t step total_size;
Matrix* mat = (Matrix*)arr;
step = mat->step;
//if( mat->data.ptr != 0 )
// CV_ERROR( CV_StsError “Data is already allocated“ );
if( step == 0 )
step = ELEM_SIZE(mat->type)*mat->cols;
total_size = step*mat->rows + sizeof(int) + MALLOC_ALIGN;
mat->refcount = (int*)malloc( (size_t)total_size );
mat->data.ptr = (uchar*)AlignPtr( mat->refcount + 1 MALLOC_ALIGN );
*mat->refcount = 1;
//}
}
Matrix* CHOSVD::CreateMat( int height int width int type )
{
Matrix* arr = 0;
arr = CreateMatHeader( height width type );
CreateData( arr );
return arr;
}
/* y[0:m0:n] += diag(a[0:10:m]) * x[0:m0:n] */
void CHOSVD::iMatrAXPY_64f( int m int n const double* x int dx
const double* a double* y int dy )
{
int i j;
for( i = 0; i < m; i++ x += dx y += dy )
{
double s = a[i];
for( j = 0; j <= n - 4; j += 4 )
{
double t0 = y[j] + s*x[j];
double t1 = y[j+1] + s*x[j+1];
y[j] = t0;
y[j+1] = t1;
t0 = y[j+2] + s*x[j+2];
t1 = y[j+3] + s*x[j+3];
y[j+2] = t0;
y[j+3] = t1;
}
for( ; j < n; j++ ) y[j] += s*x[j];
}
}
/* y[1:m-1] = h*y[1:m0:n]*x[0:10:n]‘*x[-1] (this is used for U&V reconstruction)
y[1:m0:n] += h*y[1:m0:n]*x[0:10:n]‘*x[0:10:n] */
void CHOSVD::iMatrAXPY3_64f( int m int n const double* x int l double* y double h )
{
int i j;
for( i = 1; i < m; i++ )
{
double s = 0;
y += l;
for( j = 0; j <= n - 4; j += 4 )
s += x[j]*y[j] + x[j+1]*y[j+1] + x[j+2]*y[j+2] + x[j+3]*y[j+3];
for( ; j < n; j++ ) s += x[j]*y[j];
s *= h;
y[-1] = s*x[-1];
for( j = 0; j <= n - 4; j += 4 )
{
double t0 = y[j] + s*x[j];
double t1 = y[j+1] + s*x[j+1];
y[j] = t0;
y[j+1] = t1;
t0 = y[j+2] + s*x[j+2];
t1 = y[j+3] + s*x[j+3];
y[j+2] = t0;
y[j+3] =
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 32739 2009-03-04 22:28 HOSVD.cpp
文件 4343 2009-03-04 22:24 HOSVD.h
文件 5315 2009-03-04 22:24 HosvdView.cpp
文件 1140 2009-03-04 21:01 HosvdView.h
----------- --------- ---------- ----- ----
43537 4
- 上一篇:C语言 机房收费管理系统
- 下一篇:MFC 多线程之间通过消息传递数据
相关资源
- opencv+udp+c++ 的摄像头实时传输显示源
- C语言程序设计学生成绩管理系统
- AES详细源码C语言实现带注释
- 基于串口温度采集程序及源代码
- 马的极小满覆盖源代码C++编写
- C++ Primer 5th 习题集 源代码
- vc++基于MFC实现多媒体播放器源码
- c++学生成绩管理系统源代码+实验报告
- 进程调度的设计与实现图形界面实现
- C++远程监控软件源码
- C++经典练习例题200例
- C++原始SOCKET编写的SYN Flood 源码
- springsnail项目源码
- 图书信息管理系统设计源代码C++
- 基于神经网络方法的专家系统源代码
- C语言 华容道源代码
- 基于c++的RSA加密解密程序及源码
- stm32_Cjson源码
- CGridListCtrlEx源码vc++
- 语音识别系统源码
- VC++ 串口调试助手源代码
- 四种VC表格控件源码
- mfcc源代码
- ftp的C++源码实现,可以进行文件传输
- 数据结构课程设计CC++描述[阮宏一][程
- gprs程序源代码
- vc++FTP搜索工具()
- 基于VC++的图像修复源代码
- c语言课程设计图书信息管理系统
- cocos2dx 3.17 2048游戏的源码
评论
共有 条评论