www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - mir.ndslice: assign a vector to a matrix row

reply David <scherd3113 gmail.com> writes:
Hi

I am wondering if it is possible to assign a vector to a row of a 
matrix?

============ main.d ==========
import mir.ndslice;

void main() {

   auto matrix = slice!double(3, 4);
   matrix[] = 0;
   matrix.diagonal[] = 1;

   auto row = matrix[0];
   row[3] = 4;
   assert(matrix[0, 3] == 4);

   // assign it to rows of a matrix?
   auto vector = sliced!(double)([10, 11, 12, 13]);

   // ??? Here I would like to assign the vector to the last (but 
it is not working)
   // matrix[2] = vector;
}
============

So I am wondering what the correct way is to do such an 
assignment without looping?
Dec 15 2018
parent reply 9il <ilyayaroshenko gmail.com> writes:
On Saturday, 15 December 2018 at 19:04:37 UTC, David wrote:
 Hi

 I am wondering if it is possible to assign a vector to a row of 
 a matrix?

 ============ main.d ==========
 import mir.ndslice;

 void main() {

   auto matrix = slice!double(3, 4);
   matrix[] = 0;
   matrix.diagonal[] = 1;

   auto row = matrix[0];
   row[3] = 4;
   assert(matrix[0, 3] == 4);

   // assign it to rows of a matrix?
   auto vector = sliced!(double)([10, 11, 12, 13]);

   // ??? Here I would like to assign the vector to the last 
 (but it is not working)
   // matrix[2] = vector;
 }
 ============

 So I am wondering what the correct way is to do such an 
 assignment without looping?
matrix[2][] = vector; Or matrix[2,0..$] = vector;
Dec 26 2018
parent reply David <scherd3113 gmail.com> writes:
On Wednesday, 26 December 2018 at 18:59:25 UTC, 9il wrote:
 On Saturday, 15 December 2018 at 19:04:37 UTC, David wrote:
 Hi

 I am wondering if it is possible to assign a vector to a row 
 of a matrix?

 ============ main.d ==========
 import mir.ndslice;

 void main() {

   auto matrix = slice!double(3, 4);
   matrix[] = 0;
   matrix.diagonal[] = 1;

   auto row = matrix[0];
   row[3] = 4;
   assert(matrix[0, 3] == 4);

   // assign it to rows of a matrix?
   auto vector = sliced!(double)([10, 11, 12, 13]);

   // ??? Here I would like to assign the vector to the last 
 (but it is not working)
   // matrix[2] = vector;
 }
 ============

 So I am wondering what the correct way is to do such an 
 assignment without looping?
matrix[2][] = vector; Or matrix[2,0..$] = vector;
great many thanks!! Is there any logic why getting a row works by auto row = matrix[0]; but assigning to a row works (only) by the two variant you posted?
Dec 27 2018
parent reply 9il <ilyayaroshenko gmail.com> writes:
On Thursday, 27 December 2018 at 21:17:48 UTC, David wrote:
 On Wednesday, 26 December 2018 at 18:59:25 UTC, 9il wrote:
 On Saturday, 15 December 2018 at 19:04:37 UTC, David wrote:
 Hi

 I am wondering if it is possible to assign a vector to a row 
 of a matrix?

 ============ main.d ==========
 import mir.ndslice;

 void main() {

   auto matrix = slice!double(3, 4);
   matrix[] = 0;
   matrix.diagonal[] = 1;

   auto row = matrix[0];
   row[3] = 4;
   assert(matrix[0, 3] == 4);

   // assign it to rows of a matrix?
   auto vector = sliced!(double)([10, 11, 12, 13]);

   // ??? Here I would like to assign the vector to the last 
 (but it is not working)
   // matrix[2] = vector;
 }
 ============

 So I am wondering what the correct way is to do such an 
 assignment without looping?
matrix[2][] = vector; Or matrix[2,0..$] = vector;
great many thanks!! Is there any logic why getting a row works by auto row = matrix[0]; but assigning to a row works (only) by the two variant you posted?
This case gets a slice of a row, it does not copy the data. So row[i] is matrix[0, i], the same number in the RAM. auto row = matrix[0]; This case gets a slice of a row, it does not copy the data. If you wish to copy data you need to use a slice on the right side: row[] = matrix[0]; or auto row = matrix[0].slice; // 'slice' allocates new data For columns: col[] = matrix[0 .. $, 0];
Dec 28 2018
parent reply 9il <ilyayaroshenko gmail.com> writes:
On Friday, 28 December 2018 at 08:09:09 UTC, 9il wrote:
 On Thursday, 27 December 2018 at 21:17:48 UTC, David wrote:
 On Wednesday, 26 December 2018 at 18:59:25 UTC, 9il wrote:
 On Saturday, 15 December 2018 at 19:04:37 UTC, David wrote:
 [...]
matrix[2][] = vector; Or matrix[2,0..$] = vector;
great many thanks!! Is there any logic why getting a row works by auto row = matrix[0]; but assigning to a row works (only) by the two variant you posted?
This case gets a slice of a row, it does not copy the data. So row[i] is matrix[0, i], the same number in the RAM. auto row = matrix[0]; This case gets a slice of a row, it does not copy the data. If you wish to copy data you need to use a slice on the right side:
EDIT: a slice on the LEFT side
Dec 28 2018
parent David <scherd3113 gmail.com> writes:
On Friday, 28 December 2018 at 08:11:37 UTC, 9il wrote:
 On Friday, 28 December 2018 at 08:09:09 UTC, 9il wrote:
 On Thursday, 27 December 2018 at 21:17:48 UTC, David wrote:
 On Wednesday, 26 December 2018 at 18:59:25 UTC, 9il wrote:
 [...]
great many thanks!! Is there any logic why getting a row works by auto row = matrix[0]; but assigning to a row works (only) by the two variant you posted?
This case gets a slice of a row, it does not copy the data. So row[i] is matrix[0, i], the same number in the RAM. auto row = matrix[0]; This case gets a slice of a row, it does not copy the data. If you wish to copy data you need to use a slice on the right side:
EDIT: a slice on the LEFT side
Many thanks for this background!!
Dec 28 2018