How can I squeeze singleton dimension after getting a SubArray? - c#

I have a two dimensional array 'v' representing a list of vectors
And I have a three dimensional array 'a' that represents a list of matrices
ILArray v = counter(2, 3);
ILArray a = counter(2, 3, 3);
Now I want to take a subarray of both and do a matrix multiply:
ILArray av = multiply(a[1,full,full], v[1,full]);
It will complain that the dimensions do not match and this is because the dimensions of a[1,full,full] is (1,3,3) and of v[1,full] is (1,3). In other words, the subarrays contain a singleton dimension. In matlab I can remove these singleton dimensions with squeeze(). But how can I do that in ILNumerics?
I just discovered that if the singleton dimension are trailing, then they are automagically removed by ILNumerics, so this works:
ILArray v = counter(3, 2);
ILArray a = counter(3, 3, 2);
ILArray av = multiply(a[full,full, 1], v[full, 1]);
Also, a[full,full,1] has dimension (3,3) and not (3,3,1).
Does that mean that ILNumerics does not support non-trailing singleton dimensions? In other words, does not support strided arrays in calculations but only contiguous ones? That would be rather restrictive to say the least.
Thanks,
Luc

Shouldn’t a simple reshape do the trick?
ILArray<int> I = ILMath.counter<int>(1,1,ILMath.size(5,4,3));
I
<Int32> [5,4,3]
[0]: (:,:,0)
[1]: 1 6 11 16
[2]: 2 7 12 17
[3]: 3 8 13 18
[4]: 4 9 14 19
[5]: 5 10 15 20
[6]: (:,:,1)
[7]: 21 26 31 36
[8]: 22 27 32 37
[9]: 23 28 33 38
[10]: 24 29 34 39
[11]: 25 30 35 40
[12]: (:,:,2)
[13]: 41 46 51 56
[14]: 42 47 52 57
[15]: 43 48 53 58
[16]: 44 49 54 59
[17]: 45 50 55 60
I["0;:;:"]
<Int32> [1,4,3]
[0]: (:,:,0)
[1]: 1 6 11 16
[2]: (:,:,1)
[3]: 21 26 31 36
[4]: (:,:,2)
[5]: 41 46 51 56
ILMath.reshape(I["0;:;:"],4,3)
<Int32> [4,3]
[0]: 1 21 41
[1]: 6 26 46
[2]: 11 31 51
[3]: 16 36 56
Having a squeeze function would be more convenient. You may open a feature request on the bugtracker in order to have it implemented in one of the next releases: http://ilnumerics.net/mantis

Related

Creat matrix numbers from 1 to 64 with only one loop how can I do that?

I want to create a method with signature:
void InitMatrixLinear(int[,] matrix)
but with only one loop I don't wanna create the same photo with two loops I need to make the same photo with only one loop how can I create this?
Like this I want to create:
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
Assuming the matrix passed in is 8x8 (since we want [1,2,...,64] as the elements):
for (int i = 0; i < 64; i++){
matrix[i%8,i/8] = i+1;
}
or
for (int i = 0; i < 64; i++){
matrix[i/8,i%8] = i+1;
}
Depending on the desired orientation of the matrix

Getting different LRC (Long Range Checksum) result

I'm trying to send a request to a TCP/IP terminal. My LRC function as below:
public byte GetLRC(byte[] bArr)
{
byte LRC = 0x00;
foreach (byte b in bArr)
{
LRC ^= b;
}
return LRC;
}
But the problem is my LRC and their sample LRC are totally different. How can they calculate this?
My message data request is almost the same as their except the LRC.
Sample data:
Hex: 0 66 30 30 30 30 30 30 30 30 32 34 31 30 33 30 30 31 30 1C 54 32 0 2 30 31 1C 34 33 0 1 30 1C 34 30 0 12 30 30 30 30 30 30 30 30 30 30 30 31 1C 34 32 0 12 30 30 30 30 30 30 30 30 30 30 30 30 1C 79
Bytes:
{byte[68]}
[0]: 0
[1]: 102
[2]: 48
[3]: 48
[4]: 48
[5]: 48
[6]: 48
[7]: 48
[8]: 48
[9]: 48
[10]: 50
[11]: 52
[12]: 49
[13]: 48
[14]: 51
[15]: 48
[16]: 48
[17]: 49
[18]: 48
[19]: 28
[20]: 84
[21]: 50
[22]: 0
[23]: 2
[24]: 48
[25]: 49
[26]: 28
[27]: 52
[28]: 51
[29]: 0
[30]: 1
[31]: 48
[32]: 28
[33]: 52
[34]: 48
[35]: 0
[36]: 18
[37]: 48
[38]: 48
[39]: 48
[40]: 48
[41]: 48
[42]: 48
[43]: 48
[44]: 48
[45]: 48
[46]: 48
[47]: 48
[48]: 49
[49]: 28
[50]: 52
[51]: 50
[52]: 0
[53]: 18
[54]: 48
[55]: 48
[56]: 48
[57]: 48
[58]: 48
[59]: 48
[60]: 48
[61]: 48
[62]: 48
[63]: 48
[64]: 48
[65]: 48
[66]: 28
[67]: 121
My data:
0 66 30 30 30 30 30 30 30 30 32 34 31 30 33 30 30 31 30 1C 54 32 0 2 30 31 1C 34 33 0 1 30 1C 34 30 0 12 30 30 30 30 30 30 30 30 30 30 30 31 1C 34 32 0 12 30 30 30 30 30 30 30 30 30 30 30 30 1C 1F
{byte[68]}
[0]: 0
[1]: 102
[2]: 48
[3]: 48
[4]: 48
[5]: 48
[6]: 48
[7]: 48
[8]: 48
[9]: 48
[10]: 50
[11]: 52
[12]: 49
[13]: 48
[14]: 51
[15]: 48
[16]: 48
[17]: 49
[18]: 48
[19]: 28
[20]: 84
[21]: 50
[22]: 0
[23]: 2
[24]: 48
[25]: 49
[26]: 28
[27]: 52
[28]: 51
[29]: 0
[30]: 1
[31]: 48
[32]: 28
[33]: 52
[34]: 48
[35]: 0
[36]: 18
[37]: 48
[38]: 48
[39]: 48
[40]: 48
[41]: 48
[42]: 48
[43]: 48
[44]: 48
[45]: 48
[46]: 48
[47]: 48
[48]: 49
[49]: 28
[50]: 52
[51]: 50
[52]: 0
[53]: 18
[54]: 48
[55]: 48
[56]: 48
[57]: 48
[58]: 48
[59]: 48
[60]: 48
[61]: 48
[62]: 48
[63]: 48
[64]: 48
[65]: 48
[66]: 28
[67]: 31

C# input matrix from text file crash [duplicate]

This question already has answers here:
Splitting string based on variable number of white spaces
(2 answers)
Closed 6 years ago.
here is my source code at the moment..
CODE:
static void InputValues()
{
int row, col;
string[] words;
matrixName = fileIn.ReadLine();
words = fileIn.ReadLine().Split(' ');
dimenOne = int.Parse(words[0]);
dimenTwo = int.Parse(words[1]);
matrix = new int[dimenOne+1, dimenTwo+1];
for (row = 1; row <= dimenOne; row++)
{
words = fileIn.ReadLine().Split(' ');
for (col = 1; col <= dimenTwo; col++)
{
matrix[row, col] = int.Parse(words[col-1]);
}
}
}
My program will crash after it reads in the first value of 45 after
matrix[row, col] = int.Parse(words[col-1]); there are 3 spaces between values in the text file which is posted below. How do i populate the 2-d array without crashing?
TXT FILE
3
Matrix One
5 7
45 38 5 56 18 34 4
87 56 23 41 75 87 97
45 97 86 7 6 8 85
67 6 79 65 41 37 4
7 76 57 68 8 78 2
Matrix Two
6 8
45 38 5 56 18 34 4 30
87 56 23 41 75 87 97 49
45 97 86 7 6 8 85 77
67 6 79 65 41 37 4 53
7 76 57 68 8 78 2 14
21 18 46 99 17 3 11 73
Matrix Three
6 6
45 38 5 56 18 34
87 56 23 41 75 87
45 97 86 7 6 8
67 6 79 65 41 37
7 76 57 68 8 78
21 18 46 99 17 3
Either test if you can convert the value to an integer (using TryParse) or better use a regular expression to parse the input string. Your problem is that the split function returns more results than you expect (can easily be seen if you set a breakpoint after words = filein....)
If you have a variable number of spaces in your lines, you should eliminate them.
words = fileIn.ReadLine()
.Split(' ')
.Where(x => !string.IsNullOrWhiteSpace(x))
.ToArray();

Selection Sort trouble with indexes [duplicate]

This question already has an answer here:
Selection Sort trouble with indexes
(1 answer)
Closed 6 years ago.
Actually I'm dealing with CodeAbbey problem, so I don't want answer as code, but explenation about that, what I am doing wrong. http://www.codeabbey.com/index/task_view/selection-sort
My Selection Sort actually works without any problems, but I don't know why I do not get proper indexes (when sorting works!). I.e. for input data:5 1 3 6 2 4 7 9 8 0 I got it sorted to 0 1 2 3 4 5 6 7 8 9, as I wished.
Here is the code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelectionSort
{
class Program
{
static void Main(string[] args)
{
int howMany = int.Parse(Console.ReadLine()); //length of array
List<int> Base = new List<int>(Array.ConvertAll(Console.ReadLine().Split(), int.Parse)); //input to array (i.e. 5 1 3 6 2 4 7 9 8 0 => { 5, 1, 3, 6, 2, 4, 7, 9, 8, 0 })
List<int> Output = new List<int>(); // list to store sorted array
string[] ans = new string[howMany]; // array for storing answers
int loops = Base.Count();
for(int i = 0; i != loops; i++)
{
int topID = 0, topValue = 0;
for(int j = 0; j != Base.Count(); j++)
{
if (j == 0)
{
topID = 0;
topValue = Base[0];
}
else
{
if(topValue < Base[j])
{
topValue = Base[j];
topID = j;
}
}
}
ans[i] = topID.ToString(); //after looping through array save topID to answer array
Output.Add(Base[topID]); //add topValue to output
Base.RemoveAt(topID); //remove topValue with index topID from list
}
//Output.Reverse(); // Writing on stdout
//foreach(var s in Output) // sorted array
//{ //
// Console.Write(s + " "); // It works without any problems
//} //
//Console.ReadLine(); //
foreach(var s in ans)
{
Console.Write(s + " "); // write on stdout stored indexes
}
Console.ReadLine();
}
}
}
I.e. for such a test data:
124
144 146 4 121 106 142 153 168 122 42 135 127 126 16 193 52 29 161 186 83 152 72 51 125 37 116 187 133 183 132 80 53 185 129 7 189 98 128 32 33 56 157 49 50 10 77 11 196 160 162 68 43 14 181 112 113 94 100 165 79 172 159 156 57 9 6 66 86 17 63 46 178 130 88 192 124 105 182 34 18 76 155 24 89 123 12 179 109 188 13 40 5 163 45 27 85 103 93 69 58 25 81 145 92 30 138 154 177 158 140 91 171 139 67 175 184 120 8 54 147 84 174 95 55
I got it sorted to:
4 5 6 7 8 9 10 11 12 13 14 16 17 18 24 25 27 29 30 32 33 34 37 40 42 43 45 46 49 50 51 52 53 54 55 56 57 58 63 66 67 68 69 72 76 77 79 80 81 83 84 85 86 88 89 91 92 93 94 95 98 100 103 105 106 109 112 113 116 120 121 122 123 124 125 126 127 128 129 130 132 133 135 138 139 140 142 144 145 146 147 152 153 154 155 156 157 158 159 160 161 162 163 165 168 171 172 174 175 177 178 179 181 182 183 184 185 186 187 188 189 192 193 196
and I got such an indexes:
47 14 72 34 84 25 17 29 107 25 69 46 76 63 94 100 105 52 96 7 49 76 41 15 39 47 86 33 46 61 82 6 15 87 1 75 0 3 76 77 75 5 16 16 46 18 20 5 5 11 42 48 3 1 64 10 26 25 44 1 36 48 25 12 58 23 45 49 50 37 32 28 41 49 5 43 8 21 16 29 5 35 16 37 21 22 32 18 11 34 33 7 3 4 9 8 15 22 10 1 18 3 12 5 4 17 2 14 14 10 9 8 1 4 7 6 3 2 2 4 1 1 1 0
when I was supposed to get these:
47 14 74 35 88 26 18 32 115 28 77 53 86 71 107 28 74 60 86 7 58 92 49 17 48 61 28 41 62 81 60 6 20 88 1 6 0 5 74 53 5 10 27 29 72 33 37 11 12 23 12 53 8 3 32 25 55 54 0 4 11 41 57 36 14 56 28 56 8 5 12 8 41 35 19 19 30 14 45 29 21 28 35 37 5 32 19 11 19 30 26 31 15 22 21 28 3 11 19 9 6 9 11 5 15 7 16 3 3 10 12 3 3 8 1 6 6 3 4 3 1 0 1
What am I doing wrong?
Greetings
You should be swapping topValue with the last unsorted element instead of removing it. I guess you could remove it after swapping if you wanted. But if you don't remove it and you properly ignore the sorted elements, the original collection will be sorted at the end, so you won't have to make any Add() or Reverse() calls or create a new collection.

C# How to only select strings based on a common set of characters?

I have certain numbers placed in lines in a file, the only lines I am interested with are the lines that contain the set of characters "4 2 0" in this order example below:
.....
128 2 2 0 24 49 50 46
129 4 2 0 26 51 36 54 53
130 4 2 0 26 51 41 52 56
....
Here I would discard the line that starts by 128, and keep the two others. What is the best way to do this for the whole file(knowing that lines with such a set of characters are not necessarily at the same spot)? Thank you for your help...
The following should do the trick:
string str = #"128 2 2 0 24 49 50 46
129 4 2 0 26 51 36 54 53
130 4 2 0 26 51 41 52 56";
string[] strSplitted = str.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
List<string> result = strSplitted.ToList();
foreach (var item in strSplitted)
{
if (!item.Contains("4 2 0"))
{
result.Remove(item);
}
}
The "result" variable will have the right results.

Categories

Resources