AIチップをmbedから駆動するためのプログラムです.

Dependencies:   mbed

Committer:
toriten1024
Date:
Sat Mar 16 14:54:57 2019 +0000
Revision:
1:18e8ead6f188
mbed_fest 2019 spring Nagoya ; Neural Network demo code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
toriten1024 1:18e8ead6f188 1 #include "mbed.h"
toriten1024 1:18e8ead6f188 2 #include "matrix_const.hpp"
toriten1024 1:18e8ead6f188 3 #ifndef INCLUDE_MATRIX
toriten1024 1:18e8ead6f188 4 #define INCLUDE_MATRIX
toriten1024 1:18e8ead6f188 5
toriten1024 1:18e8ead6f188 6 namespace mat
toriten1024 1:18e8ead6f188 7 {
toriten1024 1:18e8ead6f188 8 template <typename TYPE>
toriten1024 1:18e8ead6f188 9 class Matrix
toriten1024 1:18e8ead6f188 10 {
toriten1024 1:18e8ead6f188 11
toriten1024 1:18e8ead6f188 12 public:
toriten1024 1:18e8ead6f188 13 TYPE *data;
toriten1024 1:18e8ead6f188 14 int height;//if height == 0 then dimension y is zero
toriten1024 1:18e8ead6f188 15 int width;//
toriten1024 1:18e8ead6f188 16 int channel;//
toriten1024 1:18e8ead6f188 17 int insert_index;//
toriten1024 1:18e8ead6f188 18
toriten1024 1:18e8ead6f188 19 void assert(int flag){
toriten1024 1:18e8ead6f188 20 if(! flag){
toriten1024 1:18e8ead6f188 21 printf("error has happend\n\r");
toriten1024 1:18e8ead6f188 22 }
toriten1024 1:18e8ead6f188 23 }
toriten1024 1:18e8ead6f188 24 /******************************************************************************************
toriten1024 1:18e8ead6f188 25 * Calcrate index from x,y,x axis
toriten1024 1:18e8ead6f188 26 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 27 int calc_pos(int x, int y, int d)
toriten1024 1:18e8ead6f188 28 {
toriten1024 1:18e8ead6f188 29 int pos = 0;
toriten1024 1:18e8ead6f188 30 pos += d * (width * height);
toriten1024 1:18e8ead6f188 31 pos += y * width;
toriten1024 1:18e8ead6f188 32 pos += x;
toriten1024 1:18e8ead6f188 33 return pos;
toriten1024 1:18e8ead6f188 34 }
toriten1024 1:18e8ead6f188 35
toriten1024 1:18e8ead6f188 36 // Constructor Create Matrix Instance
toriten1024 1:18e8ead6f188 37 void initialize(int width, int height, int channel)
toriten1024 1:18e8ead6f188 38 {
toriten1024 1:18e8ead6f188 39 assert(channel > 0 && height > 0 && width > 0);
toriten1024 1:18e8ead6f188 40 this->channel = channel;
toriten1024 1:18e8ead6f188 41 this->height = height;
toriten1024 1:18e8ead6f188 42 this->width = width;
toriten1024 1:18e8ead6f188 43 this->data = (TYPE *)calloc(width * height * channel, sizeof(TYPE));
toriten1024 1:18e8ead6f188 44 this->insert_index = 0;
toriten1024 1:18e8ead6f188 45 }
toriten1024 1:18e8ead6f188 46
toriten1024 1:18e8ead6f188 47 /******************************************************************************************
toriten1024 1:18e8ead6f188 48 * Create 1D Matrix data, like a vector
toriten1024 1:18e8ead6f188 49 * args
toriten1024 1:18e8ead6f188 50 * width vector length
toriten1024 1:18e8ead6f188 51 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 52 Matrix(int width)
toriten1024 1:18e8ead6f188 53 {
toriten1024 1:18e8ead6f188 54 assert(width > 0);
toriten1024 1:18e8ead6f188 55 initialize(width, 1, 1);
toriten1024 1:18e8ead6f188 56 }
toriten1024 1:18e8ead6f188 57 /******************************************************************************************
toriten1024 1:18e8ead6f188 58 * Create 2D Matrix data
toriten1024 1:18e8ead6f188 59 * args
toriten1024 1:18e8ead6f188 60 * width : matrix width
toriten1024 1:18e8ead6f188 61 * height : matrix height
toriten1024 1:18e8ead6f188 62 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 63 Matrix(int width, int height)
toriten1024 1:18e8ead6f188 64 {
toriten1024 1:18e8ead6f188 65 assert(width > 0 && height > 0);
toriten1024 1:18e8ead6f188 66 initialize(width, height, 1);
toriten1024 1:18e8ead6f188 67 }
toriten1024 1:18e8ead6f188 68
toriten1024 1:18e8ead6f188 69 /******************************************************************************************
toriten1024 1:18e8ead6f188 70 * Create 3D Matrix data
toriten1024 1:18e8ead6f188 71 * args
toriten1024 1:18e8ead6f188 72 * width : matrix width
toriten1024 1:18e8ead6f188 73 * height : matrix height
toriten1024 1:18e8ead6f188 74 * channel : matrix channel, in other word matrix depth
toriten1024 1:18e8ead6f188 75 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 76 Matrix(int width, int height, int channel)
toriten1024 1:18e8ead6f188 77 {
toriten1024 1:18e8ead6f188 78 assert(width > 0 && height > 0 && channel > 0);
toriten1024 1:18e8ead6f188 79 initialize(width, height, channel);
toriten1024 1:18e8ead6f188 80 }
toriten1024 1:18e8ead6f188 81
toriten1024 1:18e8ead6f188 82 //Copy constructor
toriten1024 1:18e8ead6f188 83 Matrix(const Matrix &obj)
toriten1024 1:18e8ead6f188 84 {
toriten1024 1:18e8ead6f188 85 this->width = obj.width;
toriten1024 1:18e8ead6f188 86 this->height = obj.height;
toriten1024 1:18e8ead6f188 87 this->channel = obj.channel;
toriten1024 1:18e8ead6f188 88 this->insert_index = obj.insert_index;
toriten1024 1:18e8ead6f188 89
toriten1024 1:18e8ead6f188 90 this->data = (TYPE *)calloc(obj.width * obj.height * obj.channel, sizeof(TYPE));
toriten1024 1:18e8ead6f188 91 for (int i = 0; i < (obj.width * obj.height * obj.channel); i++)
toriten1024 1:18e8ead6f188 92 {
toriten1024 1:18e8ead6f188 93 this->data[i] = obj.data[i];
toriten1024 1:18e8ead6f188 94 }
toriten1024 1:18e8ead6f188 95 }
toriten1024 1:18e8ead6f188 96
toriten1024 1:18e8ead6f188 97 //Copy
toriten1024 1:18e8ead6f188 98 void operator=(const Matrix<TYPE> &obj)
toriten1024 1:18e8ead6f188 99 {
toriten1024 1:18e8ead6f188 100 this->width = obj.width;
toriten1024 1:18e8ead6f188 101 this->height = obj.height;
toriten1024 1:18e8ead6f188 102 this->channel = obj.channel;
toriten1024 1:18e8ead6f188 103 this->insert_index = obj.insert_index;
toriten1024 1:18e8ead6f188 104
toriten1024 1:18e8ead6f188 105 if (this->data != NULL)
toriten1024 1:18e8ead6f188 106 {
toriten1024 1:18e8ead6f188 107 free(this->data);
toriten1024 1:18e8ead6f188 108 }
toriten1024 1:18e8ead6f188 109
toriten1024 1:18e8ead6f188 110 this->data = data = (TYPE *)calloc(obj.width * obj.height * obj.channel, sizeof(TYPE));
toriten1024 1:18e8ead6f188 111 for (int i = 0; i < (obj.width * obj.height * obj.channel); i++)
toriten1024 1:18e8ead6f188 112 {
toriten1024 1:18e8ead6f188 113 this->data[i] = obj.data[i];
toriten1024 1:18e8ead6f188 114 }
toriten1024 1:18e8ead6f188 115 }
toriten1024 1:18e8ead6f188 116
toriten1024 1:18e8ead6f188 117 //Destructor
toriten1024 1:18e8ead6f188 118 ~Matrix()
toriten1024 1:18e8ead6f188 119 {
toriten1024 1:18e8ead6f188 120 if (this->data != NULL)
toriten1024 1:18e8ead6f188 121 {
toriten1024 1:18e8ead6f188 122 free(this->data);
toriten1024 1:18e8ead6f188 123 this->data = NULL;
toriten1024 1:18e8ead6f188 124 }
toriten1024 1:18e8ead6f188 125 }
toriten1024 1:18e8ead6f188 126
toriten1024 1:18e8ead6f188 127 // Reshapes configure aspects
toriten1024 1:18e8ead6f188 128
toriten1024 1:18e8ead6f188 129 /******************************************************************************************
toriten1024 1:18e8ead6f188 130 * Convert to 1D Matrix data, like a vector
toriten1024 1:18e8ead6f188 131 * args
toriten1024 1:18e8ead6f188 132 * width : vectot lengs
toriten1024 1:18e8ead6f188 133 * return
toriten1024 1:18e8ead6f188 134 * reshaped Matrix
toriten1024 1:18e8ead6f188 135 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 136 Matrix<TYPE> reshape(int width)
toriten1024 1:18e8ead6f188 137 {
toriten1024 1:18e8ead6f188 138 assert(this->width != 0 && this->height != 0 && this->channel != 0);
toriten1024 1:18e8ead6f188 139 assertt((this->channel * this->height * this->width) == width);
toriten1024 1:18e8ead6f188 140
toriten1024 1:18e8ead6f188 141 Matrix<TYPE> tmp(width, 1, 1);
toriten1024 1:18e8ead6f188 142 for (int i = 0; i < this->width * this->height * this->channel; i++)
toriten1024 1:18e8ead6f188 143 tmp.data[i] = this->data[i];
toriten1024 1:18e8ead6f188 144
toriten1024 1:18e8ead6f188 145 return tmp;
toriten1024 1:18e8ead6f188 146 }
toriten1024 1:18e8ead6f188 147
toriten1024 1:18e8ead6f188 148 /******************************************************************************************
toriten1024 1:18e8ead6f188 149 * Convert to 2D Matrix data
toriten1024 1:18e8ead6f188 150 * args
toriten1024 1:18e8ead6f188 151 * width : matrix width
toriten1024 1:18e8ead6f188 152 * height : matrix height
toriten1024 1:18e8ead6f188 153 * return
toriten1024 1:18e8ead6f188 154 * reshaped Matrix
toriten1024 1:18e8ead6f188 155 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 156 Matrix<TYPE> reshape(int width, int height)
toriten1024 1:18e8ead6f188 157 {
toriten1024 1:18e8ead6f188 158 assert(this->width != 0 && this->height != 0 && this->channel != 0);
toriten1024 1:18e8ead6f188 159 assert((this->channel * this->height * this->width) == width * height);
toriten1024 1:18e8ead6f188 160
toriten1024 1:18e8ead6f188 161 Matrix<TYPE> tmp(width, height, 1);
toriten1024 1:18e8ead6f188 162 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 163 tmp.data[i] = this->data[i];
toriten1024 1:18e8ead6f188 164
toriten1024 1:18e8ead6f188 165 return tmp;
toriten1024 1:18e8ead6f188 166 }
toriten1024 1:18e8ead6f188 167
toriten1024 1:18e8ead6f188 168 /******************************************************************************************
toriten1024 1:18e8ead6f188 169 * Convert to 3D Matrix data
toriten1024 1:18e8ead6f188 170 * args
toriten1024 1:18e8ead6f188 171 * width : matrix width
toriten1024 1:18e8ead6f188 172 * height : matrix height
toriten1024 1:18e8ead6f188 173 * channel : matrix channel, in other word matrix depth
toriten1024 1:18e8ead6f188 174 * return
toriten1024 1:18e8ead6f188 175 * reshaped Matrix
toriten1024 1:18e8ead6f188 176 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 177 Matrix<TYPE> reshape(int width, int height, int channel)
toriten1024 1:18e8ead6f188 178 {
toriten1024 1:18e8ead6f188 179 assert(this->width != 0 && this->height != 0 && this->channel != 0);
toriten1024 1:18e8ead6f188 180 assert((this->channel * this->height * this->width) == (channel * width * height));
toriten1024 1:18e8ead6f188 181
toriten1024 1:18e8ead6f188 182 Matrix<TYPE> tmp(width, height, channel);
toriten1024 1:18e8ead6f188 183 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 184 tmp.data[i] = this->data[i];
toriten1024 1:18e8ead6f188 185
toriten1024 1:18e8ead6f188 186 return tmp;
toriten1024 1:18e8ead6f188 187 }
toriten1024 1:18e8ead6f188 188
toriten1024 1:18e8ead6f188 189 /******************************************************************************************
toriten1024 1:18e8ead6f188 190 * Opt out Matrix datas
toriten1024 1:18e8ead6f188 191 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 192 void show(void)
toriten1024 1:18e8ead6f188 193 {
toriten1024 1:18e8ead6f188 194 for (int i = 0; i < this->channel; i++)
toriten1024 1:18e8ead6f188 195 {
toriten1024 1:18e8ead6f188 196 if (i > 1){
toriten1024 1:18e8ead6f188 197 printf("channel %d",i);
toriten1024 1:18e8ead6f188 198 printf("\n\r");
toriten1024 1:18e8ead6f188 199 }
toriten1024 1:18e8ead6f188 200 printf("[");
toriten1024 1:18e8ead6f188 201 for (int j = 0; j < this->height; j++)
toriten1024 1:18e8ead6f188 202 {
toriten1024 1:18e8ead6f188 203 printf("[");
toriten1024 1:18e8ead6f188 204 for (int k = 0; k < this->width; k++)
toriten1024 1:18e8ead6f188 205 {
toriten1024 1:18e8ead6f188 206 int ptr = (i * this->width * this->height) + (j * this->width) + k;
toriten1024 1:18e8ead6f188 207 printf("%F ",(double)data[ptr].to_double()); //ごめんなさい
toriten1024 1:18e8ead6f188 208 }
toriten1024 1:18e8ead6f188 209 printf("]");
toriten1024 1:18e8ead6f188 210 if (j < this->height - 1)
toriten1024 1:18e8ead6f188 211 {
toriten1024 1:18e8ead6f188 212 printf("\n\r");
toriten1024 1:18e8ead6f188 213 }
toriten1024 1:18e8ead6f188 214 }
toriten1024 1:18e8ead6f188 215 printf("]");
toriten1024 1:18e8ead6f188 216 printf("\n\r");
toriten1024 1:18e8ead6f188 217 }
toriten1024 1:18e8ead6f188 218 }
toriten1024 1:18e8ead6f188 219 /******************************************************************************************
toriten1024 1:18e8ead6f188 220 * Opt out Matrix datas in 1/0
toriten1024 1:18e8ead6f188 221 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 222 void show_bin(void)
toriten1024 1:18e8ead6f188 223 {
toriten1024 1:18e8ead6f188 224 for (int i = 0; i < this->channel; i++)
toriten1024 1:18e8ead6f188 225 {
toriten1024 1:18e8ead6f188 226 if (i > 1){
toriten1024 1:18e8ead6f188 227 printf("channel %d",i );
toriten1024 1:18e8ead6f188 228 printf("\n\r");
toriten1024 1:18e8ead6f188 229 }
toriten1024 1:18e8ead6f188 230 printf("[");
toriten1024 1:18e8ead6f188 231 for (int j = 0; j < this->height; j++)
toriten1024 1:18e8ead6f188 232 {
toriten1024 1:18e8ead6f188 233 printf("[");
toriten1024 1:18e8ead6f188 234 for (int k = 0; k < this->width; k++)
toriten1024 1:18e8ead6f188 235 {
toriten1024 1:18e8ead6f188 236 int ptr = (i * this->width * this->height) + (j * this->width) + k;
toriten1024 1:18e8ead6f188 237 printf(" %d",((data[ptr] > 0) ? 1 : 0));
toriten1024 1:18e8ead6f188 238 }
toriten1024 1:18e8ead6f188 239 printf("]");
toriten1024 1:18e8ead6f188 240 if (j < this->height - 1)
toriten1024 1:18e8ead6f188 241 {
toriten1024 1:18e8ead6f188 242 printf("\n\r");
toriten1024 1:18e8ead6f188 243 }
toriten1024 1:18e8ead6f188 244 }
toriten1024 1:18e8ead6f188 245 printf("]");
toriten1024 1:18e8ead6f188 246 printf("\n\r");
toriten1024 1:18e8ead6f188 247 }
toriten1024 1:18e8ead6f188 248 }
toriten1024 1:18e8ead6f188 249
toriten1024 1:18e8ead6f188 250 /******************************************************************************************
toriten1024 1:18e8ead6f188 251 * opt out Matrix Dimensions Lengths
toriten1024 1:18e8ead6f188 252 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 253 void shape(void)
toriten1024 1:18e8ead6f188 254 {
toriten1024 1:18e8ead6f188 255 if (this->height == 0 || this->channel == 0)
toriten1024 1:18e8ead6f188 256 {
toriten1024 1:18e8ead6f188 257 printf"%d",width);
toriten1024 1:18e8ead6f188 258 printf("\n\r");
toriten1024 1:18e8ead6f188 259 }
toriten1024 1:18e8ead6f188 260 else if (this->channel == 0)
toriten1024 1:18e8ead6f188 261 {
toriten1024 1:18e8ead6f188 262 printf("%d,%d",this->width,this->height)
toriten1024 1:18e8ead6f188 263 printf("\n\r");
toriten1024 1:18e8ead6f188 264 }
toriten1024 1:18e8ead6f188 265 else
toriten1024 1:18e8ead6f188 266 {
toriten1024 1:18e8ead6f188 267 printf("%d,%d,%d",this->width,this->height,this->channel);
toriten1024 1:18e8ead6f188 268 printf("\n\r");
toriten1024 1:18e8ead6f188 269 }
toriten1024 1:18e8ead6f188 270 }
toriten1024 1:18e8ead6f188 271
toriten1024 1:18e8ead6f188 272 /******************************************************************************************
toriten1024 1:18e8ead6f188 273 * Calcate Innner Product
toriten1024 1:18e8ead6f188 274 * args
toriten1024 1:18e8ead6f188 275 * obj : same type matrix. A.dot(B) is AB
toriten1024 1:18e8ead6f188 276 * return
toriten1024 1:18e8ead6f188 277 * Matrix of innner product matrix
toriten1024 1:18e8ead6f188 278 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 279
toriten1024 1:18e8ead6f188 280 Matrix<TYPE> dot(Matrix<TYPE> obj)
toriten1024 1:18e8ead6f188 281 {
toriten1024 1:18e8ead6f188 282 assert(this->channel == obj.channel);
toriten1024 1:18e8ead6f188 283 assert(this->width == obj.height);
toriten1024 1:18e8ead6f188 284 //avoid null
toriten1024 1:18e8ead6f188 285 assert((0 < this->width && 0 < this->height) || (0 < obj.width && 0 < obj.height));
toriten1024 1:18e8ead6f188 286
toriten1024 1:18e8ead6f188 287 if ((this->height == 0) || (obj.height == 0))
toriten1024 1:18e8ead6f188 288 {
toriten1024 1:18e8ead6f188 289 //multiplying condition
toriten1024 1:18e8ead6f188 290 assert(this->width == obj.width);
toriten1024 1:18e8ead6f188 291 Matrix<TYPE> sum(1);
toriten1024 1:18e8ead6f188 292 for (int i = 0; i < width; i++)
toriten1024 1:18e8ead6f188 293 {
toriten1024 1:18e8ead6f188 294 sum.data[0] = sum.data[0] + this->data[i] * obj.data[i];
toriten1024 1:18e8ead6f188 295 }
toriten1024 1:18e8ead6f188 296 return sum;
toriten1024 1:18e8ead6f188 297 }
toriten1024 1:18e8ead6f188 298 else
toriten1024 1:18e8ead6f188 299 {
toriten1024 1:18e8ead6f188 300 //multiplying condition
toriten1024 1:18e8ead6f188 301 assert((0 < this->width || 0 < this->height) || (0 < obj.width || 0 < obj.height));
toriten1024 1:18e8ead6f188 302 assert(this->width == obj.height);
toriten1024 1:18e8ead6f188 303
toriten1024 1:18e8ead6f188 304 Matrix<TYPE> result(obj.width, this->height, this->channel);
toriten1024 1:18e8ead6f188 305
toriten1024 1:18e8ead6f188 306 for (int i = 0; i < result.channel; i++)
toriten1024 1:18e8ead6f188 307 //channel
toriten1024 1:18e8ead6f188 308 {
toriten1024 1:18e8ead6f188 309 int channel_offset = (result.width * result.height) * i;
toriten1024 1:18e8ead6f188 310 for (int j = 0; j < result.height; j++)
toriten1024 1:18e8ead6f188 311 //height
toriten1024 1:18e8ead6f188 312 {
toriten1024 1:18e8ead6f188 313 int line_offset = j * result.width;
toriten1024 1:18e8ead6f188 314
toriten1024 1:18e8ead6f188 315 for (int k = 0; k < result.width; k++)
toriten1024 1:18e8ead6f188 316 //width
toriten1024 1:18e8ead6f188 317 {
toriten1024 1:18e8ead6f188 318 //line inner
toriten1024 1:18e8ead6f188 319 TYPE sum = 0.0;
toriten1024 1:18e8ead6f188 320 for (int l = 0; l < this->width; l++)
toriten1024 1:18e8ead6f188 321 {
toriten1024 1:18e8ead6f188 322 int pt_this = l + j * this->width;
toriten1024 1:18e8ead6f188 323 int pt_obj = l * obj.width + k;
toriten1024 1:18e8ead6f188 324 sum = sum + this->data[pt_this] * obj.data[pt_obj];
toriten1024 1:18e8ead6f188 325 }
toriten1024 1:18e8ead6f188 326 // std::cout << channel_offset + line_offset + k << "=" << sum << printf("\n\r");
toriten1024 1:18e8ead6f188 327 result.data[channel_offset + line_offset + k] = sum;
toriten1024 1:18e8ead6f188 328 }
toriten1024 1:18e8ead6f188 329 }
toriten1024 1:18e8ead6f188 330 }
toriten1024 1:18e8ead6f188 331 return result;
toriten1024 1:18e8ead6f188 332 }
toriten1024 1:18e8ead6f188 333 }
toriten1024 1:18e8ead6f188 334
toriten1024 1:18e8ead6f188 335 /******************************************************************************************
toriten1024 1:18e8ead6f188 336 * Calcrate self transpose
toriten1024 1:18e8ead6f188 337 * return
toriten1024 1:18e8ead6f188 338 * transposed Matrix
toriten1024 1:18e8ead6f188 339 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 340 Matrix<TYPE> transpose(void)
toriten1024 1:18e8ead6f188 341 {
toriten1024 1:18e8ead6f188 342 //only 2d array
toriten1024 1:18e8ead6f188 343 assertt(channel == 1);
toriten1024 1:18e8ead6f188 344 Matrix<TYPE> result(this->height, this->width, this->channel);
toriten1024 1:18e8ead6f188 345 for (int h_index = 0; h_index < height; h_index++)
toriten1024 1:18e8ead6f188 346 {
toriten1024 1:18e8ead6f188 347 for (int w_index = 0; w_index < width; w_index++)
toriten1024 1:18e8ead6f188 348 {
toriten1024 1:18e8ead6f188 349 result.data[result.calc_pos(h_index, w_index, 0)] = this->data[this->calc_pos(w_index, h_index, 0)];
toriten1024 1:18e8ead6f188 350 }
toriten1024 1:18e8ead6f188 351 }
toriten1024 1:18e8ead6f188 352 return result;
toriten1024 1:18e8ead6f188 353 }
toriten1024 1:18e8ead6f188 354
toriten1024 1:18e8ead6f188 355 /******************************************************************************************
toriten1024 1:18e8ead6f188 356 * Aplly argment function to all elements
toriten1024 1:18e8ead6f188 357 * return
toriten1024 1:18e8ead6f188 358 * Applyed Element Matrix
toriten1024 1:18e8ead6f188 359 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 360 Matrix<TYPE> apply(TYPE (*func)(TYPE))
toriten1024 1:18e8ead6f188 361 {
toriten1024 1:18e8ead6f188 362 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 363 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 364 {
toriten1024 1:18e8ead6f188 365 result.data[i] = func(this->data[i]);
toriten1024 1:18e8ead6f188 366 }
toriten1024 1:18e8ead6f188 367 return result;
toriten1024 1:18e8ead6f188 368 }
toriten1024 1:18e8ead6f188 369
toriten1024 1:18e8ead6f188 370 /******************************************************************************************
toriten1024 1:18e8ead6f188 371 * Pic up max value from matrix
toriten1024 1:18e8ead6f188 372 * arg
toriten1024 1:18e8ead6f188 373 * axis direction of pic up line or face, this data dimention is lower 1 this Matrix
toriten1024 1:18e8ead6f188 374 *
toriten1024 1:18e8ead6f188 375 * If this matrix's dimention is 1, then,,
toriten1024 1:18e8ead6f188 376 * result is 1 element matrix;
toriten1024 1:18e8ead6f188 377 * If this matrix's dimention is 2, then...
toriten1024 1:18e8ead6f188 378 * if axis is 0, pic up veatrical max value array.
toriten1024 1:18e8ead6f188 379 * else if axis is 1, pic up horizonal max value attai,
toriten1024 1:18e8ead6f188 380 * If this matrix's dimention is 3 ,then...
toriten1024 1:18e8ead6f188 381 * if axis is 0, pic up veatrical max value face.
toriten1024 1:18e8ead6f188 382 * else if axis is 1, pic up horizonal max value face.
toriten1024 1:18e8ead6f188 383 * else if axis is 2, pic up depth nax value face.
toriten1024 1:18e8ead6f188 384 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 385
toriten1024 1:18e8ead6f188 386 Matrix<TYPE> max(int axis)
toriten1024 1:18e8ead6f188 387 {
toriten1024 1:18e8ead6f188 388 assert(this->width != 0 && this->height != 0 && this->channel != 0);
toriten1024 1:18e8ead6f188 389 if ((width == 1 || height == 1) && channel == 1)
toriten1024 1:18e8ead6f188 390 {
toriten1024 1:18e8ead6f188 391 Matrix<TYPE> result(1, 1, 1);
toriten1024 1:18e8ead6f188 392 result.data[0] = this->data[0];
toriten1024 1:18e8ead6f188 393 for (int i = 0; i < (this->width * this->height * this->channel); i++)
toriten1024 1:18e8ead6f188 394 {
toriten1024 1:18e8ead6f188 395 if (result.data[0] < this->data[i])
toriten1024 1:18e8ead6f188 396 {
toriten1024 1:18e8ead6f188 397 result.data[0] = this->data[i];
toriten1024 1:18e8ead6f188 398 }
toriten1024 1:18e8ead6f188 399 }
toriten1024 1:18e8ead6f188 400 return result;
toriten1024 1:18e8ead6f188 401 }
toriten1024 1:18e8ead6f188 402 else if (channel == 1)
toriten1024 1:18e8ead6f188 403 {
toriten1024 1:18e8ead6f188 404 if (axis == 0)
toriten1024 1:18e8ead6f188 405 //row direction
toriten1024 1:18e8ead6f188 406 {
toriten1024 1:18e8ead6f188 407 Matrix<TYPE> result(1, this->height);
toriten1024 1:18e8ead6f188 408 for (int y = 0; y < this->height; y++)
toriten1024 1:18e8ead6f188 409 {
toriten1024 1:18e8ead6f188 410 result.data[result.calc_pos(0, y, 0)] = this->data[calc_pos(0, y, 0)];
toriten1024 1:18e8ead6f188 411 for (int i = 0; i < this->width; i++)
toriten1024 1:18e8ead6f188 412 {
toriten1024 1:18e8ead6f188 413 if (result.data[result.calc_pos(0, y, 0)] < this->data[calc_pos(i, y, 0)])
toriten1024 1:18e8ead6f188 414 {
toriten1024 1:18e8ead6f188 415 result.data[result.calc_pos(0, y, 0)] = this->data[calc_pos(i, y, 0)];
toriten1024 1:18e8ead6f188 416 }
toriten1024 1:18e8ead6f188 417 }
toriten1024 1:18e8ead6f188 418 }
toriten1024 1:18e8ead6f188 419 return result;
toriten1024 1:18e8ead6f188 420 }
toriten1024 1:18e8ead6f188 421 else if (axis == 1)
toriten1024 1:18e8ead6f188 422 //colmn direction
toriten1024 1:18e8ead6f188 423 {
toriten1024 1:18e8ead6f188 424 Matrix<TYPE> result(this->width, 1);
toriten1024 1:18e8ead6f188 425 for (int x = 0; x < this->height; x++)
toriten1024 1:18e8ead6f188 426 {
toriten1024 1:18e8ead6f188 427 result.data[result.calc_pos(x, 0, 0)] = this->data[calc_pos(x, 0, 0)];
toriten1024 1:18e8ead6f188 428
toriten1024 1:18e8ead6f188 429 for (int i = 0; i < this->height; i++)
toriten1024 1:18e8ead6f188 430 {
toriten1024 1:18e8ead6f188 431 if (result.data[result.calc_pos(x, 0, 0)] < this->data[calc_pos(x, i, 0)])
toriten1024 1:18e8ead6f188 432 {
toriten1024 1:18e8ead6f188 433 result.data[result.calc_pos(x, 0, 0)] = this->data[calc_pos(x, i, 0)];
toriten1024 1:18e8ead6f188 434 }
toriten1024 1:18e8ead6f188 435 }
toriten1024 1:18e8ead6f188 436 }
toriten1024 1:18e8ead6f188 437 return result;
toriten1024 1:18e8ead6f188 438 }
toriten1024 1:18e8ead6f188 439 }
toriten1024 1:18e8ead6f188 440 else if (1 < channel)
toriten1024 1:18e8ead6f188 441 {
toriten1024 1:18e8ead6f188 442 if (axis == 0)
toriten1024 1:18e8ead6f188 443 //row direction
toriten1024 1:18e8ead6f188 444 {
toriten1024 1:18e8ead6f188 445 Matrix<TYPE> result(1, this->height, this->channel);
toriten1024 1:18e8ead6f188 446 for (int y = 0; y < this->height; y++)
toriten1024 1:18e8ead6f188 447 {
toriten1024 1:18e8ead6f188 448 for (int z = 0; z < this->channel; z++)
toriten1024 1:18e8ead6f188 449 {
toriten1024 1:18e8ead6f188 450 result.data[result.calc_pos(0, y, z)] = this->data[calc_pos(0, y, z)];
toriten1024 1:18e8ead6f188 451 for (int i = 0; i < this->width; i++)
toriten1024 1:18e8ead6f188 452 {
toriten1024 1:18e8ead6f188 453
toriten1024 1:18e8ead6f188 454 if (result.data[result.calc_pos(0, y, z)] < this->data[calc_pos(i, y, z)])
toriten1024 1:18e8ead6f188 455 {
toriten1024 1:18e8ead6f188 456 result.data[result.calc_pos(0, y, z)] = this->data[calc_pos(i, y, z)];
toriten1024 1:18e8ead6f188 457 }
toriten1024 1:18e8ead6f188 458 }
toriten1024 1:18e8ead6f188 459 }
toriten1024 1:18e8ead6f188 460 }
toriten1024 1:18e8ead6f188 461 return result;
toriten1024 1:18e8ead6f188 462 }
toriten1024 1:18e8ead6f188 463
toriten1024 1:18e8ead6f188 464 else if (axis == 1)
toriten1024 1:18e8ead6f188 465 //column direction
toriten1024 1:18e8ead6f188 466 {
toriten1024 1:18e8ead6f188 467 Matrix<TYPE> result(this->width, 1, this->channel);
toriten1024 1:18e8ead6f188 468 for (int x = 0; x < this->height; x++)
toriten1024 1:18e8ead6f188 469 {
toriten1024 1:18e8ead6f188 470 for (int z = 0; z < this->channel; z++)
toriten1024 1:18e8ead6f188 471 {
toriten1024 1:18e8ead6f188 472 result.data[result.calc_pos(x, 0, z)] = this->data[calc_pos(x, 0, z)];
toriten1024 1:18e8ead6f188 473 for (int i = 0; i < this->height; i++)
toriten1024 1:18e8ead6f188 474 {
toriten1024 1:18e8ead6f188 475
toriten1024 1:18e8ead6f188 476 if (result.data[result.calc_pos(x, 0, z)] < this->data[calc_pos(x, i, z)])
toriten1024 1:18e8ead6f188 477 {
toriten1024 1:18e8ead6f188 478 result.data[result.calc_pos(x, 0, z)] = this->data[calc_pos(x, i, z)];
toriten1024 1:18e8ead6f188 479 }
toriten1024 1:18e8ead6f188 480 }
toriten1024 1:18e8ead6f188 481 }
toriten1024 1:18e8ead6f188 482 }
toriten1024 1:18e8ead6f188 483 return result;
toriten1024 1:18e8ead6f188 484 }
toriten1024 1:18e8ead6f188 485 else if (axis == 2)
toriten1024 1:18e8ead6f188 486 //depth direction
toriten1024 1:18e8ead6f188 487 {
toriten1024 1:18e8ead6f188 488 Matrix<TYPE> result(this->width, this->height, 1);
toriten1024 1:18e8ead6f188 489
toriten1024 1:18e8ead6f188 490 for (int x = 0; x < this->height; x++)
toriten1024 1:18e8ead6f188 491 {
toriten1024 1:18e8ead6f188 492 for (int y = 0; y < this->channel; y++)
toriten1024 1:18e8ead6f188 493 {
toriten1024 1:18e8ead6f188 494 result.data[result.calc_pos(x, y, 0)] = this->data[calc_pos(x, y, 0)];
toriten1024 1:18e8ead6f188 495
toriten1024 1:18e8ead6f188 496 for (int i = 0; i < this->channel; i++)
toriten1024 1:18e8ead6f188 497 {
toriten1024 1:18e8ead6f188 498
toriten1024 1:18e8ead6f188 499 if (result.data[result.calc_pos(x, y, 0)] < this->data[calc_pos(x, y, i)])
toriten1024 1:18e8ead6f188 500 {
toriten1024 1:18e8ead6f188 501 result.data[result.calc_pos(x, y, 0)] = this->data[calc_pos(x, y, i)];
toriten1024 1:18e8ead6f188 502 }
toriten1024 1:18e8ead6f188 503 }
toriten1024 1:18e8ead6f188 504 }
toriten1024 1:18e8ead6f188 505 }
toriten1024 1:18e8ead6f188 506 return result;
toriten1024 1:18e8ead6f188 507 }
toriten1024 1:18e8ead6f188 508 }
toriten1024 1:18e8ead6f188 509 }
toriten1024 1:18e8ead6f188 510
toriten1024 1:18e8ead6f188 511 /******************************************************************************************
toriten1024 1:18e8ead6f188 512 * Pic up index of max value from matrix
toriten1024 1:18e8ead6f188 513 * arg
toriten1024 1:18e8ead6f188 514 * axis direction of pic up line or face, this data dimention is lower 1 this Matrix
toriten1024 1:18e8ead6f188 515 *
toriten1024 1:18e8ead6f188 516 * If this matrix's dimention is 1, then,,
toriten1024 1:18e8ead6f188 517 * result is 1 element matrix;
toriten1024 1:18e8ead6f188 518 * If this matrix's dimention is 2, then...
toriten1024 1:18e8ead6f188 519 * if axis is 0, pic up veatrical index array of max values.
toriten1024 1:18e8ead6f188 520 * else if axis is 1, pic up horizonal index array of max values,
toriten1024 1:18e8ead6f188 521 * If this matrix's dimention is 3 ,then...
toriten1024 1:18e8ead6f188 522 * if axis is 0, pic up veatrical index face of max values.
toriten1024 1:18e8ead6f188 523 * else if axis is 1, pic up horizonal index face of max values.
toriten1024 1:18e8ead6f188 524 * else if axis is 2, pic up depth index face of max values.
toriten1024 1:18e8ead6f188 525 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 526 Matrix<TYPE> max_arg(int axis)
toriten1024 1:18e8ead6f188 527 {
toriten1024 1:18e8ead6f188 528 assert(height != 0 && channel != 0);
toriten1024 1:18e8ead6f188 529 if ((width == 0 || height == 0) && channel == 1)
toriten1024 1:18e8ead6f188 530 {
toriten1024 1:18e8ead6f188 531 Matrix<TYPE> result(1, 1, 1);
toriten1024 1:18e8ead6f188 532 Matrix<TYPE> result_index(1, 1, 1);
toriten1024 1:18e8ead6f188 533 result.data[0] = this->data[0];
toriten1024 1:18e8ead6f188 534 result_index.data[0] = this->data[0];
toriten1024 1:18e8ead6f188 535
toriten1024 1:18e8ead6f188 536 for (int i = 0; i < (this->width * this->height * this->channel); i++)
toriten1024 1:18e8ead6f188 537 {
toriten1024 1:18e8ead6f188 538 if (result.data[0] < this->data[i])
toriten1024 1:18e8ead6f188 539 {
toriten1024 1:18e8ead6f188 540 result.data[0] = this->data[i];
toriten1024 1:18e8ead6f188 541 result_index.data[0] = (double)i;
toriten1024 1:18e8ead6f188 542 }
toriten1024 1:18e8ead6f188 543 }
toriten1024 1:18e8ead6f188 544 return result_index;
toriten1024 1:18e8ead6f188 545 }
toriten1024 1:18e8ead6f188 546 else if (channel == 1)
toriten1024 1:18e8ead6f188 547 {
toriten1024 1:18e8ead6f188 548 if (axis == 0)
toriten1024 1:18e8ead6f188 549 //row direction
toriten1024 1:18e8ead6f188 550 {
toriten1024 1:18e8ead6f188 551 Matrix<TYPE> result(1, this->height);
toriten1024 1:18e8ead6f188 552 Matrix<TYPE> result_index(1, this->height);
toriten1024 1:18e8ead6f188 553 for (int y = 0; y < this->height; y++)
toriten1024 1:18e8ead6f188 554 {
toriten1024 1:18e8ead6f188 555 result.data[result.calc_pos(0, y, 0)] = this->data[calc_pos(0, y, 0)];
toriten1024 1:18e8ead6f188 556 result_index.data[result_index.calc_pos(0, y, 0)] = 0;
toriten1024 1:18e8ead6f188 557
toriten1024 1:18e8ead6f188 558 for (int i = 0; i < this->width; i++)
toriten1024 1:18e8ead6f188 559 {
toriten1024 1:18e8ead6f188 560
toriten1024 1:18e8ead6f188 561 if (result.data[result.calc_pos(0, y, 0)] < this->data[calc_pos(i, y, 0)])
toriten1024 1:18e8ead6f188 562 {
toriten1024 1:18e8ead6f188 563 result.data[result.calc_pos(0, y, 0)] = this->data[calc_pos(i, y, 0)];
toriten1024 1:18e8ead6f188 564 result_index.data[result_index.calc_pos(0, y, 0)] = (double)i;
toriten1024 1:18e8ead6f188 565 }
toriten1024 1:18e8ead6f188 566 }
toriten1024 1:18e8ead6f188 567 }
toriten1024 1:18e8ead6f188 568 return result_index;
toriten1024 1:18e8ead6f188 569 }
toriten1024 1:18e8ead6f188 570 else if (axis == 1)
toriten1024 1:18e8ead6f188 571 //colmn direction
toriten1024 1:18e8ead6f188 572 {
toriten1024 1:18e8ead6f188 573 Matrix<TYPE> result(this->width, 1);
toriten1024 1:18e8ead6f188 574 Matrix<TYPE> result_index(this->width, 1);
toriten1024 1:18e8ead6f188 575 for (int x = 0; x < this->height; x++)
toriten1024 1:18e8ead6f188 576 {
toriten1024 1:18e8ead6f188 577 result.data[result.calc_pos(x, 0, 0)] = this->data[calc_pos(x, 0, 0)];
toriten1024 1:18e8ead6f188 578 result_index.data[result_index.calc_pos(x, 0, 0)] = 0;
toriten1024 1:18e8ead6f188 579 for (int i = 0; i < this->height; i++)
toriten1024 1:18e8ead6f188 580 {
toriten1024 1:18e8ead6f188 581 if (result.data[result.calc_pos(x, 0, 0)] < this->data[calc_pos(x, i, 0)])
toriten1024 1:18e8ead6f188 582 {
toriten1024 1:18e8ead6f188 583 result.data[result.calc_pos(x, 0, 0)] = this->data[calc_pos(x, i, 0)];
toriten1024 1:18e8ead6f188 584 result_index.data[result_index.calc_pos(x, 0, 0)] = (double)i;
toriten1024 1:18e8ead6f188 585 }
toriten1024 1:18e8ead6f188 586 }
toriten1024 1:18e8ead6f188 587 }
toriten1024 1:18e8ead6f188 588 return result_index;
toriten1024 1:18e8ead6f188 589 }
toriten1024 1:18e8ead6f188 590 }
toriten1024 1:18e8ead6f188 591 else if (1 < channel)
toriten1024 1:18e8ead6f188 592 {
toriten1024 1:18e8ead6f188 593 if (axis == 0)
toriten1024 1:18e8ead6f188 594 //row direction
toriten1024 1:18e8ead6f188 595 {
toriten1024 1:18e8ead6f188 596 Matrix<TYPE> result(1, this->height, this->channel);
toriten1024 1:18e8ead6f188 597 Matrix<TYPE> result_index(1, this->height, this->channel);
toriten1024 1:18e8ead6f188 598 for (int y = 0; y < this->height; y++)
toriten1024 1:18e8ead6f188 599 {
toriten1024 1:18e8ead6f188 600 for (int z = 0; z < this->channel; z++)
toriten1024 1:18e8ead6f188 601 {
toriten1024 1:18e8ead6f188 602 result.data[result.calc_pos(0, y, z)] = this->data[calc_pos(0, y, z)];
toriten1024 1:18e8ead6f188 603 result_index.data[result_index.calc_pos(0, y, z)] = 0;
toriten1024 1:18e8ead6f188 604
toriten1024 1:18e8ead6f188 605 for (int i = 0; i < this->width; i++)
toriten1024 1:18e8ead6f188 606 {
toriten1024 1:18e8ead6f188 607
toriten1024 1:18e8ead6f188 608 if (result.data[result.calc_pos(0, y, z)] < this->data[calc_pos(i, y, z)])
toriten1024 1:18e8ead6f188 609 {
toriten1024 1:18e8ead6f188 610 result.data[result.calc_pos(0, y, z)] = this->data[calc_pos(i, y, z)];
toriten1024 1:18e8ead6f188 611 result_index.data[result_index.calc_pos(0, y, z)] = (double)i;
toriten1024 1:18e8ead6f188 612 }
toriten1024 1:18e8ead6f188 613 }
toriten1024 1:18e8ead6f188 614 }
toriten1024 1:18e8ead6f188 615 }
toriten1024 1:18e8ead6f188 616 return result_index;
toriten1024 1:18e8ead6f188 617 }
toriten1024 1:18e8ead6f188 618
toriten1024 1:18e8ead6f188 619 else if (axis == 1)
toriten1024 1:18e8ead6f188 620 //column direction
toriten1024 1:18e8ead6f188 621 {
toriten1024 1:18e8ead6f188 622 Matrix<TYPE> result(this->width, 1, this->channel);
toriten1024 1:18e8ead6f188 623 Matrix<TYPE> result_index(this->width, 1, this->channel);
toriten1024 1:18e8ead6f188 624 for (int x = 0; x < this->height; x++)
toriten1024 1:18e8ead6f188 625 {
toriten1024 1:18e8ead6f188 626 for (int z = 0; z < this->channel; z++)
toriten1024 1:18e8ead6f188 627 {
toriten1024 1:18e8ead6f188 628 result.data[result.calc_pos(x, 0, z)] = this->data[calc_pos(x, 0, z)];
toriten1024 1:18e8ead6f188 629 result_index.data[result_index.calc_pos(x, 0, z)] = 0;
toriten1024 1:18e8ead6f188 630
toriten1024 1:18e8ead6f188 631 for (int i = 0; i < this->height; i++)
toriten1024 1:18e8ead6f188 632 {
toriten1024 1:18e8ead6f188 633
toriten1024 1:18e8ead6f188 634 if (result.data[result.calc_pos(x, 0, z)] < this->data[calc_pos(x, i, z)])
toriten1024 1:18e8ead6f188 635 {
toriten1024 1:18e8ead6f188 636 result.data[result.calc_pos(x, 0, z)] = this->data[calc_pos(x, i, z)];
toriten1024 1:18e8ead6f188 637 result_index.data[result_index.calc_pos(x, 0, z)] = (double)i;
toriten1024 1:18e8ead6f188 638 }
toriten1024 1:18e8ead6f188 639 }
toriten1024 1:18e8ead6f188 640 }
toriten1024 1:18e8ead6f188 641 }
toriten1024 1:18e8ead6f188 642 return result_index;
toriten1024 1:18e8ead6f188 643 }
toriten1024 1:18e8ead6f188 644 else if (axis == 2)
toriten1024 1:18e8ead6f188 645 //depth direction
toriten1024 1:18e8ead6f188 646 {
toriten1024 1:18e8ead6f188 647 Matrix<TYPE> result(this->width, this->height, 1);
toriten1024 1:18e8ead6f188 648 Matrix<TYPE> result_index(this->width, this->height, 1);
toriten1024 1:18e8ead6f188 649
toriten1024 1:18e8ead6f188 650 for (int x = 0; x < this->height; x++)
toriten1024 1:18e8ead6f188 651 {
toriten1024 1:18e8ead6f188 652 for (int y = 0; y < this->channel; y++)
toriten1024 1:18e8ead6f188 653 {
toriten1024 1:18e8ead6f188 654 result.data[result.calc_pos(x, y, 0)] = this->data[calc_pos(x, y, 0)];
toriten1024 1:18e8ead6f188 655 result_index.data[result_index.calc_pos(x, y, 0)] = 0;
toriten1024 1:18e8ead6f188 656
toriten1024 1:18e8ead6f188 657 for (int i = 0; i < this->channel; i++)
toriten1024 1:18e8ead6f188 658 {
toriten1024 1:18e8ead6f188 659 if (result.data[result.calc_pos(x, y, 0)] < this->data[calc_pos(x, y, i)])
toriten1024 1:18e8ead6f188 660 {
toriten1024 1:18e8ead6f188 661 result.data[result.calc_pos(x, y, 0)] = this->data[calc_pos(x, y, i)];
toriten1024 1:18e8ead6f188 662 result_index.data[result_index.calc_pos(x, y, 0)] = (double)i;
toriten1024 1:18e8ead6f188 663 }
toriten1024 1:18e8ead6f188 664 }
toriten1024 1:18e8ead6f188 665 }
toriten1024 1:18e8ead6f188 666 }
toriten1024 1:18e8ead6f188 667 return result_index;
toriten1024 1:18e8ead6f188 668 }
toriten1024 1:18e8ead6f188 669 }
toriten1024 1:18e8ead6f188 670 }
toriten1024 1:18e8ead6f188 671
toriten1024 1:18e8ead6f188 672 /******************************************************************************************
toriten1024 1:18e8ead6f188 673 * Calcrate sum of matrix
toriten1024 1:18e8ead6f188 674 * arg
toriten1024 1:18e8ead6f188 675 * axis : direction of calcrating sums line or face, this data dimention is lower 1 this Matrix
toriten1024 1:18e8ead6f188 676 *
toriten1024 1:18e8ead6f188 677 * If this matrix's dimention is 1, then,,
toriten1024 1:18e8ead6f188 678 * result is 1 element matrix;
toriten1024 1:18e8ead6f188 679 * If this matrix's dimention is 2, then...
toriten1024 1:18e8ead6f188 680 * if axis is 0, calcrate veatrical sum array.
toriten1024 1:18e8ead6f188 681 * else if axis is 1, calcrate horizonal sum array.
toriten1024 1:18e8ead6f188 682 * If this matrix's dimention is 3 ,then...
toriten1024 1:18e8ead6f188 683 * if axis is 0, calcrate veatrical sum face.
toriten1024 1:18e8ead6f188 684 * else if axis is 1, calcrate horizonal sum face.
toriten1024 1:18e8ead6f188 685 * else if axis is 2, calcrate depth sum face.
toriten1024 1:18e8ead6f188 686 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 687
toriten1024 1:18e8ead6f188 688 Matrix<TYPE> sum(int axis)
toriten1024 1:18e8ead6f188 689 {
toriten1024 1:18e8ead6f188 690 assert(height != 0 && channel != 0);
toriten1024 1:18e8ead6f188 691 if ((width == 0 || height == 0) && channel == 1)
toriten1024 1:18e8ead6f188 692 {
toriten1024 1:18e8ead6f188 693 Matrix<TYPE> sum(1, 1, 1);
toriten1024 1:18e8ead6f188 694 for (int i = 0; i < (this->width * this->height * this->channel); i++)
toriten1024 1:18e8ead6f188 695 {
toriten1024 1:18e8ead6f188 696 sum.data[0] = sum.data[0] + this->data[i];
toriten1024 1:18e8ead6f188 697 }
toriten1024 1:18e8ead6f188 698 return sum;
toriten1024 1:18e8ead6f188 699 }
toriten1024 1:18e8ead6f188 700 else if (channel == 1)
toriten1024 1:18e8ead6f188 701 {
toriten1024 1:18e8ead6f188 702 if (axis == 0)
toriten1024 1:18e8ead6f188 703 //row direction
toriten1024 1:18e8ead6f188 704 {
toriten1024 1:18e8ead6f188 705 Matrix<TYPE> sum(1, this->height);
toriten1024 1:18e8ead6f188 706 for (int i = 0; i < this->width; i++)
toriten1024 1:18e8ead6f188 707 {
toriten1024 1:18e8ead6f188 708 for (int y = 0; y < this->height; y++)
toriten1024 1:18e8ead6f188 709 {
toriten1024 1:18e8ead6f188 710 sum.data[sum.calc_pos(0, y, 0)] = sum.data[sum.calc_pos(0, y, 0)] + this->data[calc_pos(i, y, 0)];
toriten1024 1:18e8ead6f188 711 }
toriten1024 1:18e8ead6f188 712 }
toriten1024 1:18e8ead6f188 713 return sum;
toriten1024 1:18e8ead6f188 714 }
toriten1024 1:18e8ead6f188 715 else if (axis == 1)
toriten1024 1:18e8ead6f188 716 //colmn direction
toriten1024 1:18e8ead6f188 717 {
toriten1024 1:18e8ead6f188 718 Matrix<TYPE> sum(this->width, 1);
toriten1024 1:18e8ead6f188 719 for (int i = 0; i < this->height; i++)
toriten1024 1:18e8ead6f188 720 {
toriten1024 1:18e8ead6f188 721 for (int x = 0; x < this->width; x++)
toriten1024 1:18e8ead6f188 722 {
toriten1024 1:18e8ead6f188 723 sum.data[sum.calc_pos(x, 0, 0)] = sum.data[sum.calc_pos(x, 0, 0)] + this->data[calc_pos(x, i, 0)];
toriten1024 1:18e8ead6f188 724 }
toriten1024 1:18e8ead6f188 725 }
toriten1024 1:18e8ead6f188 726 return sum;
toriten1024 1:18e8ead6f188 727 }
toriten1024 1:18e8ead6f188 728 }
toriten1024 1:18e8ead6f188 729 else if (1 < channel)
toriten1024 1:18e8ead6f188 730 {
toriten1024 1:18e8ead6f188 731 if (axis == 0)
toriten1024 1:18e8ead6f188 732 //row direction
toriten1024 1:18e8ead6f188 733 {
toriten1024 1:18e8ead6f188 734 Matrix<TYPE> sum(1, this->height, this->channel);
toriten1024 1:18e8ead6f188 735 for (int i = 0; i < this->width; i++)
toriten1024 1:18e8ead6f188 736 {
toriten1024 1:18e8ead6f188 737 for (int y = 0; y < this->height; y++)
toriten1024 1:18e8ead6f188 738 {
toriten1024 1:18e8ead6f188 739 for (int z = 0; z < this->channel; z++)
toriten1024 1:18e8ead6f188 740 {
toriten1024 1:18e8ead6f188 741 sum.data[sum.calc_pos(0, y, z)] = sum.data[sum.calc_pos(0, y, z)] + this->data[calc_pos(i, y, z)];
toriten1024 1:18e8ead6f188 742 }
toriten1024 1:18e8ead6f188 743 }
toriten1024 1:18e8ead6f188 744 }
toriten1024 1:18e8ead6f188 745 return sum;
toriten1024 1:18e8ead6f188 746 }
toriten1024 1:18e8ead6f188 747
toriten1024 1:18e8ead6f188 748 else if (axis == 1)
toriten1024 1:18e8ead6f188 749 //column direction
toriten1024 1:18e8ead6f188 750 {
toriten1024 1:18e8ead6f188 751 Matrix<TYPE> sum(this->width, 1, this->channel);
toriten1024 1:18e8ead6f188 752 for (int i = 0; i < this->height; i++)
toriten1024 1:18e8ead6f188 753 {
toriten1024 1:18e8ead6f188 754 for (int x = 0; x < this->height; x++)
toriten1024 1:18e8ead6f188 755 {
toriten1024 1:18e8ead6f188 756 for (int z = 0; z < this->channel; z++)
toriten1024 1:18e8ead6f188 757 {
toriten1024 1:18e8ead6f188 758 sum.data[sum.calc_pos(x, 0, z)] = sum.data[sum.calc_pos(x, 0, z)] + this->data[calc_pos(x, i, z)];
toriten1024 1:18e8ead6f188 759 }
toriten1024 1:18e8ead6f188 760 }
toriten1024 1:18e8ead6f188 761 }
toriten1024 1:18e8ead6f188 762 return sum;
toriten1024 1:18e8ead6f188 763 }
toriten1024 1:18e8ead6f188 764 else if (axis == 2)
toriten1024 1:18e8ead6f188 765 //depth direction
toriten1024 1:18e8ead6f188 766 {
toriten1024 1:18e8ead6f188 767 Matrix<TYPE> sum(this->width, this->height, 1);
toriten1024 1:18e8ead6f188 768
toriten1024 1:18e8ead6f188 769 for (int i = 0; i < this->channel; i++)
toriten1024 1:18e8ead6f188 770 {
toriten1024 1:18e8ead6f188 771 for (int x = 0; x < this->height; x++)
toriten1024 1:18e8ead6f188 772 {
toriten1024 1:18e8ead6f188 773 for (int y = 0; y < this->channel; y++)
toriten1024 1:18e8ead6f188 774 {
toriten1024 1:18e8ead6f188 775 sum.data[sum.calc_pos(x, y, 0)] = sum.data[sum.calc_pos(x, y, 0)] + this->data[calc_pos(x, y, i)];
toriten1024 1:18e8ead6f188 776 }
toriten1024 1:18e8ead6f188 777 }
toriten1024 1:18e8ead6f188 778 }
toriten1024 1:18e8ead6f188 779 return sum;
toriten1024 1:18e8ead6f188 780 }
toriten1024 1:18e8ead6f188 781 }
toriten1024 1:18e8ead6f188 782 }
toriten1024 1:18e8ead6f188 783 // Operator Over Rodes
toriten1024 1:18e8ead6f188 784
toriten1024 1:18e8ead6f188 785 //assign
toriten1024 1:18e8ead6f188 786 Matrix<TYPE> operator<<(double x)
toriten1024 1:18e8ead6f188 787 {
toriten1024 1:18e8ead6f188 788 this->data[this->insert_index] = x;
toriten1024 1:18e8ead6f188 789 // std::cout << this->insert_index << ":" << this->data[this->insert_index] << printf("\n\r");
toriten1024 1:18e8ead6f188 790
toriten1024 1:18e8ead6f188 791 this->insert_index = this->insert_index + 1;
toriten1024 1:18e8ead6f188 792 return *this;
toriten1024 1:18e8ead6f188 793 }
toriten1024 1:18e8ead6f188 794 //matrix vs matrix
toriten1024 1:18e8ead6f188 795 Matrix<TYPE> operator+(Matrix<TYPE> obj)
toriten1024 1:18e8ead6f188 796 {
toriten1024 1:18e8ead6f188 797
toriten1024 1:18e8ead6f188 798 if (this->width == obj.width && this->height == obj.height && this->channel == obj.channel)
toriten1024 1:18e8ead6f188 799 //simple adder
toriten1024 1:18e8ead6f188 800 {
toriten1024 1:18e8ead6f188 801 assert(this->width == obj.width && this->height == obj.height && this->channel == obj.channel);
toriten1024 1:18e8ead6f188 802 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 803 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 804 {
toriten1024 1:18e8ead6f188 805 result.data[i] = this->data[i] + obj.data[i];
toriten1024 1:18e8ead6f188 806 }
toriten1024 1:18e8ead6f188 807 return result;
toriten1024 1:18e8ead6f188 808 }
toriten1024 1:18e8ead6f188 809 //2d vs vector
toriten1024 1:18e8ead6f188 810 else if (obj.width != 1 && this->width == obj.width && obj.height == 1 && obj.channel == 1)
toriten1024 1:18e8ead6f188 811 {
toriten1024 1:18e8ead6f188 812 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 813 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 814 {
toriten1024 1:18e8ead6f188 815 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 816 {
toriten1024 1:18e8ead6f188 817 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 818 {
toriten1024 1:18e8ead6f188 819 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + obj.data[obj.calc_pos(w_index, 0, 0)];
toriten1024 1:18e8ead6f188 820 }
toriten1024 1:18e8ead6f188 821 }
toriten1024 1:18e8ead6f188 822 }
toriten1024 1:18e8ead6f188 823 return result;
toriten1024 1:18e8ead6f188 824 }
toriten1024 1:18e8ead6f188 825 else if (obj.height != 1 && obj.width == 1 && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 826 {
toriten1024 1:18e8ead6f188 827 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 828 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 829 {
toriten1024 1:18e8ead6f188 830 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 831 {
toriten1024 1:18e8ead6f188 832 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 833 {
toriten1024 1:18e8ead6f188 834 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + obj.data[obj.calc_pos(0, h_index, 0)];
toriten1024 1:18e8ead6f188 835 }
toriten1024 1:18e8ead6f188 836 }
toriten1024 1:18e8ead6f188 837 }
toriten1024 1:18e8ead6f188 838 return result;
toriten1024 1:18e8ead6f188 839 }
toriten1024 1:18e8ead6f188 840 else if (obj.channel != 1 && obj.width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 841 {
toriten1024 1:18e8ead6f188 842 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 843 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 844 {
toriten1024 1:18e8ead6f188 845 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 846 {
toriten1024 1:18e8ead6f188 847 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 848 {
toriten1024 1:18e8ead6f188 849 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + obj.data[obj.calc_pos(0, 0, c_index)];
toriten1024 1:18e8ead6f188 850 }
toriten1024 1:18e8ead6f188 851 }
toriten1024 1:18e8ead6f188 852 }
toriten1024 1:18e8ead6f188 853 return result;
toriten1024 1:18e8ead6f188 854 }
toriten1024 1:18e8ead6f188 855 //3D vs 2D
toriten1024 1:18e8ead6f188 856 else if (this->width == obj.width && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 857 //Z axis face
toriten1024 1:18e8ead6f188 858 {
toriten1024 1:18e8ead6f188 859 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 860 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 861 {
toriten1024 1:18e8ead6f188 862 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 863 {
toriten1024 1:18e8ead6f188 864 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 865 {
toriten1024 1:18e8ead6f188 866 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + obj.data[obj.calc_pos(w_index, h_index, 0)];
toriten1024 1:18e8ead6f188 867 }
toriten1024 1:18e8ead6f188 868 }
toriten1024 1:18e8ead6f188 869 }
toriten1024 1:18e8ead6f188 870 return result;
toriten1024 1:18e8ead6f188 871 }
toriten1024 1:18e8ead6f188 872 else if (this->width == obj.width && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 873 //Y axis face
toriten1024 1:18e8ead6f188 874 {
toriten1024 1:18e8ead6f188 875 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 876 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 877 {
toriten1024 1:18e8ead6f188 878 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 879 {
toriten1024 1:18e8ead6f188 880 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 881 {
toriten1024 1:18e8ead6f188 882 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + obj.data[obj.calc_pos(w_index, 0, c_index)];
toriten1024 1:18e8ead6f188 883 }
toriten1024 1:18e8ead6f188 884 }
toriten1024 1:18e8ead6f188 885 }
toriten1024 1:18e8ead6f188 886 return result;
toriten1024 1:18e8ead6f188 887 }
toriten1024 1:18e8ead6f188 888 else if (this->width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 889 //Z axis face
toriten1024 1:18e8ead6f188 890 {
toriten1024 1:18e8ead6f188 891 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 892 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 893 {
toriten1024 1:18e8ead6f188 894 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 895 {
toriten1024 1:18e8ead6f188 896 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 897 {
toriten1024 1:18e8ead6f188 898 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + obj.data[obj.calc_pos(0, h_index, c_index)];
toriten1024 1:18e8ead6f188 899 }
toriten1024 1:18e8ead6f188 900 }
toriten1024 1:18e8ead6f188 901 }
toriten1024 1:18e8ead6f188 902 return result;
toriten1024 1:18e8ead6f188 903 }
toriten1024 1:18e8ead6f188 904 assert(0);
toriten1024 1:18e8ead6f188 905 }
toriten1024 1:18e8ead6f188 906
toriten1024 1:18e8ead6f188 907 Matrix<TYPE> operator-(Matrix<TYPE> obj)
toriten1024 1:18e8ead6f188 908 {
toriten1024 1:18e8ead6f188 909
toriten1024 1:18e8ead6f188 910 assert(this->width == obj.width || this->height == obj.height || this->channel == obj.channel);
toriten1024 1:18e8ead6f188 911
toriten1024 1:18e8ead6f188 912 if (this->width == obj.width && this->height == obj.height && this->channel == obj.channel)
toriten1024 1:18e8ead6f188 913 //simple adder
toriten1024 1:18e8ead6f188 914 {
toriten1024 1:18e8ead6f188 915 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 916 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 917 {
toriten1024 1:18e8ead6f188 918 result.data[i] = this->data[i] - obj.data[i];
toriten1024 1:18e8ead6f188 919 }
toriten1024 1:18e8ead6f188 920 return result;
toriten1024 1:18e8ead6f188 921 }
toriten1024 1:18e8ead6f188 922 //2d vs vector
toriten1024 1:18e8ead6f188 923 else if (obj.width != 1 && this->width == obj.width && obj.height == 1 && obj.channel == 1)
toriten1024 1:18e8ead6f188 924 {
toriten1024 1:18e8ead6f188 925 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 926
toriten1024 1:18e8ead6f188 927 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 928 {
toriten1024 1:18e8ead6f188 929 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 930 {
toriten1024 1:18e8ead6f188 931 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 932 {
toriten1024 1:18e8ead6f188 933 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] - obj.data[obj.calc_pos(w_index, 0, 0)];
toriten1024 1:18e8ead6f188 934 }
toriten1024 1:18e8ead6f188 935 }
toriten1024 1:18e8ead6f188 936 }
toriten1024 1:18e8ead6f188 937 return result;
toriten1024 1:18e8ead6f188 938 }
toriten1024 1:18e8ead6f188 939 else if (obj.height != 1 && obj.width == 1 && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 940 {
toriten1024 1:18e8ead6f188 941 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 942 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 943 {
toriten1024 1:18e8ead6f188 944 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 945 {
toriten1024 1:18e8ead6f188 946 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 947 {
toriten1024 1:18e8ead6f188 948 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] - obj.data[obj.calc_pos(0, h_index, 0)];
toriten1024 1:18e8ead6f188 949 }
toriten1024 1:18e8ead6f188 950 }
toriten1024 1:18e8ead6f188 951 }
toriten1024 1:18e8ead6f188 952 return result;
toriten1024 1:18e8ead6f188 953 }
toriten1024 1:18e8ead6f188 954 else if (obj.channel != 1 && obj.width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 955 {
toriten1024 1:18e8ead6f188 956 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 957 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 958 {
toriten1024 1:18e8ead6f188 959 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 960 {
toriten1024 1:18e8ead6f188 961 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 962 {
toriten1024 1:18e8ead6f188 963 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] - obj.data[obj.calc_pos(0, 0, c_index)];
toriten1024 1:18e8ead6f188 964 }
toriten1024 1:18e8ead6f188 965 }
toriten1024 1:18e8ead6f188 966 }
toriten1024 1:18e8ead6f188 967 return result;
toriten1024 1:18e8ead6f188 968 }
toriten1024 1:18e8ead6f188 969 //3D vs 2D
toriten1024 1:18e8ead6f188 970 else if (this->width == obj.width && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 971 //Z axis face
toriten1024 1:18e8ead6f188 972 {
toriten1024 1:18e8ead6f188 973 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 974 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 975 {
toriten1024 1:18e8ead6f188 976 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 977 {
toriten1024 1:18e8ead6f188 978 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 979 {
toriten1024 1:18e8ead6f188 980 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] - obj.data[obj.calc_pos(w_index, h_index, 0)];
toriten1024 1:18e8ead6f188 981 }
toriten1024 1:18e8ead6f188 982 }
toriten1024 1:18e8ead6f188 983 }
toriten1024 1:18e8ead6f188 984 return result;
toriten1024 1:18e8ead6f188 985 }
toriten1024 1:18e8ead6f188 986 else if (this->width == obj.width && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 987 //Y axis face
toriten1024 1:18e8ead6f188 988 {
toriten1024 1:18e8ead6f188 989 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 990 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 991 {
toriten1024 1:18e8ead6f188 992 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 993 {
toriten1024 1:18e8ead6f188 994 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 995 {
toriten1024 1:18e8ead6f188 996 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] - obj.data[obj.calc_pos(w_index, 0, c_index)];
toriten1024 1:18e8ead6f188 997 }
toriten1024 1:18e8ead6f188 998 }
toriten1024 1:18e8ead6f188 999 }
toriten1024 1:18e8ead6f188 1000 return result;
toriten1024 1:18e8ead6f188 1001 }
toriten1024 1:18e8ead6f188 1002 else if (this->width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1003 //Z axis face
toriten1024 1:18e8ead6f188 1004 {
toriten1024 1:18e8ead6f188 1005 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1006 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1007 {
toriten1024 1:18e8ead6f188 1008 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1009 {
toriten1024 1:18e8ead6f188 1010 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1011 {
toriten1024 1:18e8ead6f188 1012 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] - obj.data[obj.calc_pos(0, h_index, c_index)];
toriten1024 1:18e8ead6f188 1013 }
toriten1024 1:18e8ead6f188 1014 }
toriten1024 1:18e8ead6f188 1015 }
toriten1024 1:18e8ead6f188 1016 return result;
toriten1024 1:18e8ead6f188 1017 }
toriten1024 1:18e8ead6f188 1018 assert(0);
toriten1024 1:18e8ead6f188 1019 }
toriten1024 1:18e8ead6f188 1020
toriten1024 1:18e8ead6f188 1021 Matrix<TYPE> operator*(Matrix<TYPE> obj)
toriten1024 1:18e8ead6f188 1022 {
toriten1024 1:18e8ead6f188 1023 assert(this->width == obj.width || this->height == obj.height || this->channel == obj.channel);
toriten1024 1:18e8ead6f188 1024
toriten1024 1:18e8ead6f188 1025 if (this->width == obj.width && this->height == obj.height && this->channel == obj.channel)
toriten1024 1:18e8ead6f188 1026 //simple adder
toriten1024 1:18e8ead6f188 1027 {
toriten1024 1:18e8ead6f188 1028 assert(this->width == obj.width && this->height == obj.height && this->channel == obj.channel);
toriten1024 1:18e8ead6f188 1029 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1030 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1031 {
toriten1024 1:18e8ead6f188 1032 result.data[i] = this->data[i] * obj.data[i];
toriten1024 1:18e8ead6f188 1033 }
toriten1024 1:18e8ead6f188 1034 return result;
toriten1024 1:18e8ead6f188 1035 }
toriten1024 1:18e8ead6f188 1036 //2d vs vector
toriten1024 1:18e8ead6f188 1037 else if (obj.width != 0 && this->width == obj.width && obj.height == 1 && obj.channel == 1)
toriten1024 1:18e8ead6f188 1038 {
toriten1024 1:18e8ead6f188 1039 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1040 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1041 {
toriten1024 1:18e8ead6f188 1042 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1043 {
toriten1024 1:18e8ead6f188 1044 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1045 {
toriten1024 1:18e8ead6f188 1046 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] * obj.data[obj.calc_pos(w_index, 0, 0)];
toriten1024 1:18e8ead6f188 1047 }
toriten1024 1:18e8ead6f188 1048 }
toriten1024 1:18e8ead6f188 1049 }
toriten1024 1:18e8ead6f188 1050 return result;
toriten1024 1:18e8ead6f188 1051 }
toriten1024 1:18e8ead6f188 1052 else if (obj.height != 1 && obj.width == 1 && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 1053 {
toriten1024 1:18e8ead6f188 1054 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1055 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1056 {
toriten1024 1:18e8ead6f188 1057 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1058 {
toriten1024 1:18e8ead6f188 1059 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1060 {
toriten1024 1:18e8ead6f188 1061 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] * obj.data[obj.calc_pos(0, h_index, 0)];
toriten1024 1:18e8ead6f188 1062 }
toriten1024 1:18e8ead6f188 1063 }
toriten1024 1:18e8ead6f188 1064 }
toriten1024 1:18e8ead6f188 1065 return result;
toriten1024 1:18e8ead6f188 1066 }
toriten1024 1:18e8ead6f188 1067 else if (obj.channel != 0 && obj.width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1068 {
toriten1024 1:18e8ead6f188 1069 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1070 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1071 {
toriten1024 1:18e8ead6f188 1072 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1073 {
toriten1024 1:18e8ead6f188 1074 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1075 {
toriten1024 1:18e8ead6f188 1076 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] * obj.data[obj.calc_pos(0, 0, c_index)];
toriten1024 1:18e8ead6f188 1077 }
toriten1024 1:18e8ead6f188 1078 }
toriten1024 1:18e8ead6f188 1079 }
toriten1024 1:18e8ead6f188 1080 return result;
toriten1024 1:18e8ead6f188 1081 }
toriten1024 1:18e8ead6f188 1082 //3D vs 2D
toriten1024 1:18e8ead6f188 1083 else if (this->width == obj.width && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 1084 //Z axis face
toriten1024 1:18e8ead6f188 1085 {
toriten1024 1:18e8ead6f188 1086 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1087 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1088 {
toriten1024 1:18e8ead6f188 1089 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1090 {
toriten1024 1:18e8ead6f188 1091 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1092 {
toriten1024 1:18e8ead6f188 1093 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] * obj.data[obj.calc_pos(w_index, h_index, 0)];
toriten1024 1:18e8ead6f188 1094 }
toriten1024 1:18e8ead6f188 1095 }
toriten1024 1:18e8ead6f188 1096 }
toriten1024 1:18e8ead6f188 1097 return result;
toriten1024 1:18e8ead6f188 1098 }
toriten1024 1:18e8ead6f188 1099 else if (this->width == obj.width && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1100 //Y axis face
toriten1024 1:18e8ead6f188 1101 {
toriten1024 1:18e8ead6f188 1102 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1103 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1104 {
toriten1024 1:18e8ead6f188 1105 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1106 {
toriten1024 1:18e8ead6f188 1107 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1108 {
toriten1024 1:18e8ead6f188 1109 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] * obj.data[obj.calc_pos(w_index, 0, c_index)];
toriten1024 1:18e8ead6f188 1110 }
toriten1024 1:18e8ead6f188 1111 }
toriten1024 1:18e8ead6f188 1112 }
toriten1024 1:18e8ead6f188 1113 return result;
toriten1024 1:18e8ead6f188 1114 }
toriten1024 1:18e8ead6f188 1115 else if (this->width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1116 //Z axis face
toriten1024 1:18e8ead6f188 1117 {
toriten1024 1:18e8ead6f188 1118 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1119 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1120 {
toriten1024 1:18e8ead6f188 1121 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1122 {
toriten1024 1:18e8ead6f188 1123 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1124 {
toriten1024 1:18e8ead6f188 1125 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] * obj.data[obj.calc_pos(0, h_index, c_index)];
toriten1024 1:18e8ead6f188 1126 }
toriten1024 1:18e8ead6f188 1127 }
toriten1024 1:18e8ead6f188 1128 }
toriten1024 1:18e8ead6f188 1129 return result;
toriten1024 1:18e8ead6f188 1130 }
toriten1024 1:18e8ead6f188 1131 assert(0);
toriten1024 1:18e8ead6f188 1132 }
toriten1024 1:18e8ead6f188 1133
toriten1024 1:18e8ead6f188 1134 Matrix<TYPE> operator/(Matrix<TYPE> obj)
toriten1024 1:18e8ead6f188 1135 {
toriten1024 1:18e8ead6f188 1136 assert(this->width == obj.width || this->height == obj.height || this->channel == obj.channel);
toriten1024 1:18e8ead6f188 1137
toriten1024 1:18e8ead6f188 1138 if (this->width == obj.width && this->height == obj.height && this->channel == obj.channel)
toriten1024 1:18e8ead6f188 1139 //simple adder
toriten1024 1:18e8ead6f188 1140 {
toriten1024 1:18e8ead6f188 1141 assert(this->width == obj.width && this->height == obj.height && this->channel == obj.channel);
toriten1024 1:18e8ead6f188 1142 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1143 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1144 {
toriten1024 1:18e8ead6f188 1145 result.data[i] = this->data[i] / obj.data[i];
toriten1024 1:18e8ead6f188 1146 }
toriten1024 1:18e8ead6f188 1147 return result;
toriten1024 1:18e8ead6f188 1148 }
toriten1024 1:18e8ead6f188 1149 //2d vs vector
toriten1024 1:18e8ead6f188 1150 else if (obj.width != 0 && this->width == obj.width && obj.height == 1 && obj.channel == 1)
toriten1024 1:18e8ead6f188 1151 {
toriten1024 1:18e8ead6f188 1152 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1153 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1154 {
toriten1024 1:18e8ead6f188 1155 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1156 {
toriten1024 1:18e8ead6f188 1157 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1158 {
toriten1024 1:18e8ead6f188 1159 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] / obj.data[obj.calc_pos(w_index, 0, 0)];
toriten1024 1:18e8ead6f188 1160 }
toriten1024 1:18e8ead6f188 1161 }
toriten1024 1:18e8ead6f188 1162 }
toriten1024 1:18e8ead6f188 1163 return result;
toriten1024 1:18e8ead6f188 1164 }
toriten1024 1:18e8ead6f188 1165 else if (obj.height != 1 && obj.width == 1 && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 1166 {
toriten1024 1:18e8ead6f188 1167 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1168 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1169 {
toriten1024 1:18e8ead6f188 1170 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1171 {
toriten1024 1:18e8ead6f188 1172 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1173 {
toriten1024 1:18e8ead6f188 1174 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] / obj.data[obj.calc_pos(0, h_index, 0)];
toriten1024 1:18e8ead6f188 1175 }
toriten1024 1:18e8ead6f188 1176 }
toriten1024 1:18e8ead6f188 1177 }
toriten1024 1:18e8ead6f188 1178 return result;
toriten1024 1:18e8ead6f188 1179 }
toriten1024 1:18e8ead6f188 1180 else if (obj.channel != 1 && obj.width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1181 {
toriten1024 1:18e8ead6f188 1182 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1183 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1184 {
toriten1024 1:18e8ead6f188 1185 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1186 {
toriten1024 1:18e8ead6f188 1187 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1188 {
toriten1024 1:18e8ead6f188 1189 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] / obj.data[obj.calc_pos(0, 0, c_index)];
toriten1024 1:18e8ead6f188 1190 }
toriten1024 1:18e8ead6f188 1191 }
toriten1024 1:18e8ead6f188 1192 }
toriten1024 1:18e8ead6f188 1193 return result;
toriten1024 1:18e8ead6f188 1194 }
toriten1024 1:18e8ead6f188 1195 //3D vs 2D
toriten1024 1:18e8ead6f188 1196 else if (this->width == obj.width && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 1197 //Z axis face
toriten1024 1:18e8ead6f188 1198 {
toriten1024 1:18e8ead6f188 1199 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1200 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1201 {
toriten1024 1:18e8ead6f188 1202 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1203 {
toriten1024 1:18e8ead6f188 1204 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1205 {
toriten1024 1:18e8ead6f188 1206 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] / obj.data[obj.calc_pos(w_index, h_index, 0)];
toriten1024 1:18e8ead6f188 1207 }
toriten1024 1:18e8ead6f188 1208 }
toriten1024 1:18e8ead6f188 1209 }
toriten1024 1:18e8ead6f188 1210 return result;
toriten1024 1:18e8ead6f188 1211 }
toriten1024 1:18e8ead6f188 1212 else if (this->width == obj.width && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1213 //Y axis face
toriten1024 1:18e8ead6f188 1214 {
toriten1024 1:18e8ead6f188 1215 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1216 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1217 {
toriten1024 1:18e8ead6f188 1218 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1219 {
toriten1024 1:18e8ead6f188 1220 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1221 {
toriten1024 1:18e8ead6f188 1222 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] / obj.data[obj.calc_pos(w_index, 0, c_index)];
toriten1024 1:18e8ead6f188 1223 }
toriten1024 1:18e8ead6f188 1224 }
toriten1024 1:18e8ead6f188 1225 }
toriten1024 1:18e8ead6f188 1226 return result;
toriten1024 1:18e8ead6f188 1227 }
toriten1024 1:18e8ead6f188 1228 else if (this->width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1229 //X axis face
toriten1024 1:18e8ead6f188 1230 {
toriten1024 1:18e8ead6f188 1231 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1232 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1233 {
toriten1024 1:18e8ead6f188 1234 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1235 {
toriten1024 1:18e8ead6f188 1236 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1237 {
toriten1024 1:18e8ead6f188 1238 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] / obj.data[obj.calc_pos(0, h_index, c_index)];
toriten1024 1:18e8ead6f188 1239 }
toriten1024 1:18e8ead6f188 1240 }
toriten1024 1:18e8ead6f188 1241 }
toriten1024 1:18e8ead6f188 1242 return result;
toriten1024 1:18e8ead6f188 1243 }
toriten1024 1:18e8ead6f188 1244 assert(0);
toriten1024 1:18e8ead6f188 1245 }
toriten1024 1:18e8ead6f188 1246
toriten1024 1:18e8ead6f188 1247 Matrix<TYPE> compare(Matrix<TYPE> obj)
toriten1024 1:18e8ead6f188 1248 {
toriten1024 1:18e8ead6f188 1249 assert(this->width == obj.width || this->height == obj.height || this->channel == obj.channel);
toriten1024 1:18e8ead6f188 1250
toriten1024 1:18e8ead6f188 1251 if (this->width == obj.width && this->height == obj.height && this->channel == obj.channel)
toriten1024 1:18e8ead6f188 1252 //simple adder
toriten1024 1:18e8ead6f188 1253 {
toriten1024 1:18e8ead6f188 1254 assert(this->width == obj.width && this->height == obj.height && this->channel == obj.channel);
toriten1024 1:18e8ead6f188 1255 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1256 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1257 {
toriten1024 1:18e8ead6f188 1258 result.data[i] = (double)(this->data[i] == obj.data[i]);
toriten1024 1:18e8ead6f188 1259 }
toriten1024 1:18e8ead6f188 1260 return result;
toriten1024 1:18e8ead6f188 1261 }
toriten1024 1:18e8ead6f188 1262 //2d vs vector
toriten1024 1:18e8ead6f188 1263 else if (obj.width != 0 && this->width == obj.width && obj.height == 1 && obj.channel == 1)
toriten1024 1:18e8ead6f188 1264 {
toriten1024 1:18e8ead6f188 1265 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1266 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1267 {
toriten1024 1:18e8ead6f188 1268 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1269 {
toriten1024 1:18e8ead6f188 1270 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1271 {
toriten1024 1:18e8ead6f188 1272 result.data[this->calc_pos(w_index, h_index, c_index)] = (double)(this->data[this->calc_pos(w_index, h_index, c_index)] == obj.data[obj.calc_pos(w_index, 0, 0)]);
toriten1024 1:18e8ead6f188 1273 }
toriten1024 1:18e8ead6f188 1274 }
toriten1024 1:18e8ead6f188 1275 }
toriten1024 1:18e8ead6f188 1276 return result;
toriten1024 1:18e8ead6f188 1277 }
toriten1024 1:18e8ead6f188 1278 else if (obj.height != 1 && obj.width == 1 && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 1279 {
toriten1024 1:18e8ead6f188 1280 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1281 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1282 {
toriten1024 1:18e8ead6f188 1283 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1284 {
toriten1024 1:18e8ead6f188 1285 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1286 {
toriten1024 1:18e8ead6f188 1287 result.data[this->calc_pos(w_index, h_index, c_index)] = (double)(this->data[this->calc_pos(w_index, h_index, c_index)] == obj.data[obj.calc_pos(0, h_index, 0)]);
toriten1024 1:18e8ead6f188 1288 }
toriten1024 1:18e8ead6f188 1289 }
toriten1024 1:18e8ead6f188 1290 }
toriten1024 1:18e8ead6f188 1291 return result;
toriten1024 1:18e8ead6f188 1292 }
toriten1024 1:18e8ead6f188 1293 else if (obj.channel != 1 && obj.width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1294 {
toriten1024 1:18e8ead6f188 1295 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1296 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1297 {
toriten1024 1:18e8ead6f188 1298 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1299 {
toriten1024 1:18e8ead6f188 1300 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1301 {
toriten1024 1:18e8ead6f188 1302 result.data[this->calc_pos(w_index, h_index, c_index)] = (double)(this->data[this->calc_pos(w_index, h_index, c_index)] == obj.data[obj.calc_pos(0, 0, c_index)]);
toriten1024 1:18e8ead6f188 1303 }
toriten1024 1:18e8ead6f188 1304 }
toriten1024 1:18e8ead6f188 1305 }
toriten1024 1:18e8ead6f188 1306 return result;
toriten1024 1:18e8ead6f188 1307 }
toriten1024 1:18e8ead6f188 1308 //3D vs 2D
toriten1024 1:18e8ead6f188 1309 else if (this->width == obj.width && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 1310 //Z axis face
toriten1024 1:18e8ead6f188 1311 {
toriten1024 1:18e8ead6f188 1312 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1313 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1314 {
toriten1024 1:18e8ead6f188 1315 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1316 {
toriten1024 1:18e8ead6f188 1317 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1318 {
toriten1024 1:18e8ead6f188 1319 result.data[this->calc_pos(w_index, h_index, c_index)] = (double)(this->data[this->calc_pos(w_index, h_index, c_index)] == obj.data[obj.calc_pos(w_index, h_index, 0)]);
toriten1024 1:18e8ead6f188 1320 }
toriten1024 1:18e8ead6f188 1321 }
toriten1024 1:18e8ead6f188 1322 }
toriten1024 1:18e8ead6f188 1323 return result;
toriten1024 1:18e8ead6f188 1324 }
toriten1024 1:18e8ead6f188 1325 else if (this->width == obj.width && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1326 //Y axis face
toriten1024 1:18e8ead6f188 1327 {
toriten1024 1:18e8ead6f188 1328 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1329 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1330 {
toriten1024 1:18e8ead6f188 1331 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1332 {
toriten1024 1:18e8ead6f188 1333 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1334 {
toriten1024 1:18e8ead6f188 1335 result.data[this->calc_pos(w_index, h_index, c_index)] = (double)(this->data[this->calc_pos(w_index, h_index, c_index)] == obj.data[obj.calc_pos(w_index, 0, c_index)]);
toriten1024 1:18e8ead6f188 1336 }
toriten1024 1:18e8ead6f188 1337 }
toriten1024 1:18e8ead6f188 1338 }
toriten1024 1:18e8ead6f188 1339 return result;
toriten1024 1:18e8ead6f188 1340 }
toriten1024 1:18e8ead6f188 1341 else if (this->width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1342 //X axis face
toriten1024 1:18e8ead6f188 1343 {
toriten1024 1:18e8ead6f188 1344 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1345 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1346 {
toriten1024 1:18e8ead6f188 1347 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1348 {
toriten1024 1:18e8ead6f188 1349 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1350 {
toriten1024 1:18e8ead6f188 1351 result.data[this->calc_pos(w_index, h_index, c_index)] = (double)(this->data[this->calc_pos(w_index, h_index, c_index)] == obj.data[obj.calc_pos(0, h_index, c_index)]);
toriten1024 1:18e8ead6f188 1352 }
toriten1024 1:18e8ead6f188 1353 }
toriten1024 1:18e8ead6f188 1354 }
toriten1024 1:18e8ead6f188 1355 return result;
toriten1024 1:18e8ead6f188 1356 }
toriten1024 1:18e8ead6f188 1357 assert(0);
toriten1024 1:18e8ead6f188 1358 }
toriten1024 1:18e8ead6f188 1359
toriten1024 1:18e8ead6f188 1360 //matrix vs double
toriten1024 1:18e8ead6f188 1361 Matrix<TYPE> operator+(double x)
toriten1024 1:18e8ead6f188 1362 {
toriten1024 1:18e8ead6f188 1363 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1364 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1365 {
toriten1024 1:18e8ead6f188 1366 result.data[i] = this->data[i] + x;
toriten1024 1:18e8ead6f188 1367 }
toriten1024 1:18e8ead6f188 1368 return result;
toriten1024 1:18e8ead6f188 1369 }
toriten1024 1:18e8ead6f188 1370
toriten1024 1:18e8ead6f188 1371 Matrix<TYPE> operator*(double x)
toriten1024 1:18e8ead6f188 1372 {
toriten1024 1:18e8ead6f188 1373 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1374 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1375 {
toriten1024 1:18e8ead6f188 1376 result.data[i] = this->data[i] * x;
toriten1024 1:18e8ead6f188 1377 }
toriten1024 1:18e8ead6f188 1378 return result;
toriten1024 1:18e8ead6f188 1379 }
toriten1024 1:18e8ead6f188 1380
toriten1024 1:18e8ead6f188 1381 Matrix<TYPE> operator/(double x)
toriten1024 1:18e8ead6f188 1382 {
toriten1024 1:18e8ead6f188 1383 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1384 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1385 {
toriten1024 1:18e8ead6f188 1386 result.data[i] = this->data[i] / x;
toriten1024 1:18e8ead6f188 1387 }
toriten1024 1:18e8ead6f188 1388 return result;
toriten1024 1:18e8ead6f188 1389 }
toriten1024 1:18e8ead6f188 1390
toriten1024 1:18e8ead6f188 1391 //clone
toriten1024 1:18e8ead6f188 1392 Matrix<TYPE> clone(void)
toriten1024 1:18e8ead6f188 1393 {
toriten1024 1:18e8ead6f188 1394 assert(this->data != NULL);
toriten1024 1:18e8ead6f188 1395 if (height == 0 || channel == 0)
toriten1024 1:18e8ead6f188 1396 {
toriten1024 1:18e8ead6f188 1397 Matrix<TYPE> cloned(this->width);
toriten1024 1:18e8ead6f188 1398 for (int i = 0; i < width; i++)
toriten1024 1:18e8ead6f188 1399 {
toriten1024 1:18e8ead6f188 1400 cloned.data[i] = this->data[i];
toriten1024 1:18e8ead6f188 1401 }
toriten1024 1:18e8ead6f188 1402 return cloned;
toriten1024 1:18e8ead6f188 1403 }
toriten1024 1:18e8ead6f188 1404 else
toriten1024 1:18e8ead6f188 1405 {
toriten1024 1:18e8ead6f188 1406 Matrix<TYPE> cloned(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1407 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1408 {
toriten1024 1:18e8ead6f188 1409 cloned.data[i] = this->data[i];
toriten1024 1:18e8ead6f188 1410 }
toriten1024 1:18e8ead6f188 1411 return cloned;
toriten1024 1:18e8ead6f188 1412 }
toriten1024 1:18e8ead6f188 1413 //don't copy counter of <<
toriten1024 1:18e8ead6f188 1414 }
toriten1024 1:18e8ead6f188 1415
toriten1024 1:18e8ead6f188 1416 // overwrite by random parameter
toriten1024 1:18e8ead6f188 1417 Matrix<TYPE> random(double ave, double dis)
toriten1024 1:18e8ead6f188 1418 {
toriten1024 1:18e8ead6f188 1419 assert(this->width > 0 && this->height > 0 && this->channel > 0);
toriten1024 1:18e8ead6f188 1420 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1421 std::random_device rd{};
toriten1024 1:18e8ead6f188 1422 std::mt19937 gen{rd()};
toriten1024 1:18e8ead6f188 1423
toriten1024 1:18e8ead6f188 1424 std::random_device seed_gen;
toriten1024 1:18e8ead6f188 1425 std::default_random_engine engine(seed_gen());
toriten1024 1:18e8ead6f188 1426 std::normal_distribution<double> dist(ave, dis);
toriten1024 1:18e8ead6f188 1427
toriten1024 1:18e8ead6f188 1428 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1429 {
toriten1024 1:18e8ead6f188 1430 double tmp = (double)dist(engine);
toriten1024 1:18e8ead6f188 1431 //std::cout << tmp << printf("\n\r");
toriten1024 1:18e8ead6f188 1432
toriten1024 1:18e8ead6f188 1433 result.data[i] = (tmp + 0.5);
toriten1024 1:18e8ead6f188 1434 }
toriten1024 1:18e8ead6f188 1435 return result;
toriten1024 1:18e8ead6f188 1436 }
toriten1024 1:18e8ead6f188 1437 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1438 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1439 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1440 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1441 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1442 /************************************************************turatan**************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1443 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1444 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1445 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1446 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1447 /***************************************************************************************************************************************************************************************************************************/
toriten1024 1:18e8ead6f188 1448
toriten1024 1:18e8ead6f188 1449 /******************************************************************************************
toriten1024 1:18e8ead6f188 1450 * Calcate Innner Product
toriten1024 1:18e8ead6f188 1451 * args
toriten1024 1:18e8ead6f188 1452 * obj : same type matrix. A.dot(B) is AB
toriten1024 1:18e8ead6f188 1453 * return
toriten1024 1:18e8ead6f188 1454 * Matrix of innner product matrix
toriten1024 1:18e8ead6f188 1455 * ***************************************************************************************/
toriten1024 1:18e8ead6f188 1456
toriten1024 1:18e8ead6f188 1457 Matrix<TYPE> dot(mat::ConstMatrix obj)
toriten1024 1:18e8ead6f188 1458 {
toriten1024 1:18e8ead6f188 1459 assert(this->channel == obj.channel);
toriten1024 1:18e8ead6f188 1460 assert(this->width == obj.height);
toriten1024 1:18e8ead6f188 1461 //avoid null
toriten1024 1:18e8ead6f188 1462 assert((0 < this->width && 0 < this->height) || (0 < obj.width && 0 < obj.height));
toriten1024 1:18e8ead6f188 1463
toriten1024 1:18e8ead6f188 1464 if ((this->height == 0) || (obj.height == 0))
toriten1024 1:18e8ead6f188 1465 {
toriten1024 1:18e8ead6f188 1466 //multiplying condition
toriten1024 1:18e8ead6f188 1467 assert(this->width == obj.width);
toriten1024 1:18e8ead6f188 1468 Matrix<TYPE> sum(1);
toriten1024 1:18e8ead6f188 1469 for (int i = 0; i < width; i++)
toriten1024 1:18e8ead6f188 1470 {
toriten1024 1:18e8ead6f188 1471 sum.data[0] = sum.data[0] + this->data[i] * TYPE(obj.data[i]);
toriten1024 1:18e8ead6f188 1472 }
toriten1024 1:18e8ead6f188 1473 return sum;
toriten1024 1:18e8ead6f188 1474 }
toriten1024 1:18e8ead6f188 1475 else
toriten1024 1:18e8ead6f188 1476 {
toriten1024 1:18e8ead6f188 1477 //multiplying condition
toriten1024 1:18e8ead6f188 1478 assert((0 < this->width || 0 < this->height) || (0 < obj.width || 0 < obj.height));
toriten1024 1:18e8ead6f188 1479 assert(this->width == obj.height);
toriten1024 1:18e8ead6f188 1480
toriten1024 1:18e8ead6f188 1481 Matrix<TYPE> result(obj.width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1482
toriten1024 1:18e8ead6f188 1483 for (int i = 0; i < result.channel; i++)
toriten1024 1:18e8ead6f188 1484 //channel
toriten1024 1:18e8ead6f188 1485 {
toriten1024 1:18e8ead6f188 1486 int channel_offset = (result.width * result.height) * i;
toriten1024 1:18e8ead6f188 1487 for (int j = 0; j < result.height; j++)
toriten1024 1:18e8ead6f188 1488 //height
toriten1024 1:18e8ead6f188 1489 {
toriten1024 1:18e8ead6f188 1490 int line_offset = j * result.width;
toriten1024 1:18e8ead6f188 1491
toriten1024 1:18e8ead6f188 1492 for (int k = 0; k < result.width; k++)
toriten1024 1:18e8ead6f188 1493 //width
toriten1024 1:18e8ead6f188 1494 {
toriten1024 1:18e8ead6f188 1495 //line inner
toriten1024 1:18e8ead6f188 1496 TYPE sum = 0.0;
toriten1024 1:18e8ead6f188 1497 for (int l = 0; l < this->width; l++)
toriten1024 1:18e8ead6f188 1498 {
toriten1024 1:18e8ead6f188 1499 int pt_this = l + j * this->width;
toriten1024 1:18e8ead6f188 1500 int pt_obj = l * obj.width + k;
toriten1024 1:18e8ead6f188 1501 sum = sum + this->data[pt_this] * TYPE(obj.data[pt_obj]);
toriten1024 1:18e8ead6f188 1502 }
toriten1024 1:18e8ead6f188 1503 // std::cout << channel_offset + line_offset + k << "=" << sum << printf("\n\r");
toriten1024 1:18e8ead6f188 1504 result.data[channel_offset + line_offset + k] = sum;
toriten1024 1:18e8ead6f188 1505 }
toriten1024 1:18e8ead6f188 1506 }
toriten1024 1:18e8ead6f188 1507 }
toriten1024 1:18e8ead6f188 1508 return result;
toriten1024 1:18e8ead6f188 1509 }
toriten1024 1:18e8ead6f188 1510 }
toriten1024 1:18e8ead6f188 1511
toriten1024 1:18e8ead6f188 1512
toriten1024 1:18e8ead6f188 1513 /********* + operator**************************************************/
toriten1024 1:18e8ead6f188 1514 Matrix<TYPE> operator+(mat::ConstMatrix obj)
toriten1024 1:18e8ead6f188 1515 {
toriten1024 1:18e8ead6f188 1516
toriten1024 1:18e8ead6f188 1517 if (this->width == obj.width && this->height == obj.height && this->channel == obj.channel)
toriten1024 1:18e8ead6f188 1518 //simple adder
toriten1024 1:18e8ead6f188 1519 {
toriten1024 1:18e8ead6f188 1520 assert(this->width == obj.width && this->height == obj.height && this->channel == obj.channel);
toriten1024 1:18e8ead6f188 1521 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1522 for (int i = 0; i < width * height * channel; i++)
toriten1024 1:18e8ead6f188 1523 {
toriten1024 1:18e8ead6f188 1524 result.data[i] = this->data[i] + TYPE(obj.data[i]);
toriten1024 1:18e8ead6f188 1525 }
toriten1024 1:18e8ead6f188 1526 return result;
toriten1024 1:18e8ead6f188 1527 }
toriten1024 1:18e8ead6f188 1528 //2d vs vector
toriten1024 1:18e8ead6f188 1529 else if (obj.width != 1 && this->width == obj.width && obj.height == 1 && obj.channel == 1)
toriten1024 1:18e8ead6f188 1530 {
toriten1024 1:18e8ead6f188 1531 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1532 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1533 {
toriten1024 1:18e8ead6f188 1534 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1535 {
toriten1024 1:18e8ead6f188 1536 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1537 {
toriten1024 1:18e8ead6f188 1538 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + TYPE(obj.data[obj.calc_pos(w_index, 0, 0)]);
toriten1024 1:18e8ead6f188 1539 }
toriten1024 1:18e8ead6f188 1540 }
toriten1024 1:18e8ead6f188 1541 }
toriten1024 1:18e8ead6f188 1542 return result;
toriten1024 1:18e8ead6f188 1543 }
toriten1024 1:18e8ead6f188 1544 else if (obj.height != 1 && obj.width == 1 && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 1545 {
toriten1024 1:18e8ead6f188 1546 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1547 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1548 {
toriten1024 1:18e8ead6f188 1549 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1550 {
toriten1024 1:18e8ead6f188 1551 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1552 {
toriten1024 1:18e8ead6f188 1553 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + TYPE(obj.data[obj.calc_pos(0, h_index, 0)]);
toriten1024 1:18e8ead6f188 1554 }
toriten1024 1:18e8ead6f188 1555 }
toriten1024 1:18e8ead6f188 1556 }
toriten1024 1:18e8ead6f188 1557 return result;
toriten1024 1:18e8ead6f188 1558 }
toriten1024 1:18e8ead6f188 1559 else if (obj.channel != 1 && obj.width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1560 {
toriten1024 1:18e8ead6f188 1561 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1562 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1563 {
toriten1024 1:18e8ead6f188 1564 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1565 {
toriten1024 1:18e8ead6f188 1566 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1567 {
toriten1024 1:18e8ead6f188 1568 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + TYPE(obj.data[obj.calc_pos(0, 0, c_index)]);
toriten1024 1:18e8ead6f188 1569 }
toriten1024 1:18e8ead6f188 1570 }
toriten1024 1:18e8ead6f188 1571 }
toriten1024 1:18e8ead6f188 1572 return result;
toriten1024 1:18e8ead6f188 1573 }
toriten1024 1:18e8ead6f188 1574 //3D vs 2D
toriten1024 1:18e8ead6f188 1575 else if (this->width == obj.width && obj.height == this->height && obj.channel == 1)
toriten1024 1:18e8ead6f188 1576 //Z axis face
toriten1024 1:18e8ead6f188 1577 {
toriten1024 1:18e8ead6f188 1578 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1579 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1580 {
toriten1024 1:18e8ead6f188 1581 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1582 {
toriten1024 1:18e8ead6f188 1583 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1584 {
toriten1024 1:18e8ead6f188 1585 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + TYPE(obj.data[obj.calc_pos(w_index, h_index, 0)]);
toriten1024 1:18e8ead6f188 1586 }
toriten1024 1:18e8ead6f188 1587 }
toriten1024 1:18e8ead6f188 1588 }
toriten1024 1:18e8ead6f188 1589 return result;
toriten1024 1:18e8ead6f188 1590 }
toriten1024 1:18e8ead6f188 1591 else if (this->width == obj.width && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1592 //Y axis face
toriten1024 1:18e8ead6f188 1593 {
toriten1024 1:18e8ead6f188 1594 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1595 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1596 {
toriten1024 1:18e8ead6f188 1597 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1598 {
toriten1024 1:18e8ead6f188 1599 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1600 {
toriten1024 1:18e8ead6f188 1601 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + TYPE(obj.data[obj.calc_pos(w_index, 0, c_index)]);
toriten1024 1:18e8ead6f188 1602 }
toriten1024 1:18e8ead6f188 1603 }
toriten1024 1:18e8ead6f188 1604 }
toriten1024 1:18e8ead6f188 1605 return result;
toriten1024 1:18e8ead6f188 1606 }
toriten1024 1:18e8ead6f188 1607 else if (this->width == 1 && obj.height == 1 && obj.channel == this->channel)
toriten1024 1:18e8ead6f188 1608 //Z axis face
toriten1024 1:18e8ead6f188 1609 {
toriten1024 1:18e8ead6f188 1610 Matrix<TYPE> result(this->width, this->height, this->channel);
toriten1024 1:18e8ead6f188 1611 for (int c_index = 0; c_index < this->channel; c_index++)
toriten1024 1:18e8ead6f188 1612 {
toriten1024 1:18e8ead6f188 1613 for (int h_index = 0; h_index < this->height; h_index++)
toriten1024 1:18e8ead6f188 1614 {
toriten1024 1:18e8ead6f188 1615 for (int w_index = 0; w_index < this->width; w_index++)
toriten1024 1:18e8ead6f188 1616 {
toriten1024 1:18e8ead6f188 1617 result.data[this->calc_pos(w_index, h_index, c_index)] = this->data[this->calc_pos(w_index, h_index, c_index)] + TYPE(obj.data[obj.calc_pos(0, h_index, c_index)]);
toriten1024 1:18e8ead6f188 1618 }
toriten1024 1:18e8ead6f188 1619 }
toriten1024 1:18e8ead6f188 1620 }
toriten1024 1:18e8ead6f188 1621 return result;
toriten1024 1:18e8ead6f188 1622 }
toriten1024 1:18e8ead6f188 1623 assert(0);
toriten1024 1:18e8ead6f188 1624 }
toriten1024 1:18e8ead6f188 1625 };
toriten1024 1:18e8ead6f188 1626
toriten1024 1:18e8ead6f188 1627
toriten1024 1:18e8ead6f188 1628 } // namespace mat
toriten1024 1:18e8ead6f188 1629 #endif