How Do You Create a Sub-Matrix Based on Vector Conditions?

  • Thread starter Thread starter Saladsamurai
  • Start date Start date
  • Tags Tags
    Logic Program
Click For Summary

Discussion Overview

The discussion revolves around creating a sub-matrix from a larger square matrix based on conditions defined by a column vector. Participants explore how to implement this process programmatically, focusing on the logic needed to exclude certain rows and columns from the original matrix based on the values in the vector.

Discussion Character

  • Technical explanation
  • Mathematical reasoning
  • Homework-related

Main Points Raised

  • One participant describes the goal of creating a sub-matrix R from a square matrix M by excluding rows and columns where the corresponding entries in a vector C are zero.
  • Another participant suggests a pseudocode approach to achieve this, using two counters to track the indices of the new sub-matrix R based on the conditions in vector C.
  • A later reply reiterates the pseudocode and clarifies the indexing, noting the importance of whether the arrays are 0-based or 1-based, which affects how the loops are structured.
  • There is a request for clarification on a specific part of the pseudocode, indicating some confusion about the logic being applied.

Areas of Agreement / Disagreement

Participants generally agree on the approach to creating the sub-matrix but there are discussions regarding the specifics of indexing and the implementation details, indicating some uncertainty in the exact coding practices.

Contextual Notes

There is an unresolved issue regarding the indexing of arrays, as participants mention both 0-based and 1-based indexing without reaching a consensus on which is applicable in this context.

Saladsamurai
Messages
3,009
Reaction score
7
I am confusing the heck out of myself here.

This is what I have

Square matrix that is M = 'm x m'
A column vector that is C = 'm x 1'
a smaller square matrix that is R ='r x r'Here is what I am trying to accomplish; I usually do this by hand:

The entries of the column vector C are either 1 or 0. If the ithentry in C is zero then I can "cross out" the ith row AND column in M. For example, if M is 5 x 5 and the 2nd and 4th entries of C are 0, I draw a line through the 2nd and 4th row AND column of M.

This leaves me with a 3 x 3 sub-matrix that is made up of the un-crossed out entries of M.

This sub-matrix is R. So I need to find a way to assign these values to R from M after crossing out rows and columns according to the entries of C.I have already created a test to initialize a matrix R of the correct dimensions; it is now a matter of getting the entries in there.

Something like:

Code:
For i = 1 to M
    For j = 1 to M
    If C(i,1) = 1 Then {R[something,something] = M[Something,Something]

     Next j
Next i
But I think I will need 2 more counter variables in addition to i and j so that if C(i,1)=0 the indices of R do not increment.

I am just a little lost now. Can I get a little help here? :smile:
 
Technology news on Phys.org
I would do something along the lines of:

(Pseudocode)
Code:
rx = 0
ry = 0
for(mx = 1 to M) {
    if(C[mx] == 1) {
        ry = 0
        for(my = 1 to M) {
            if(C[my] == 1) {
                R[rx][ry] = M[mx][my]
                ry++
            }
        }
        rx++
    }
}

DaveE
 
davee123 said:
I would do something along the lines of:

(Pseudocode)
Code:
rx = 0
ry = 0
for(mx = 1 to M) {
    [B]if(C[mx] == 1) {
        ry = 0[/B]
        for(my = 1 to M) {
            if(C[my] == 1) {
                R[rx][ry] = M[mx][my]
                ry++
            }
        }
        rx++
    }
}

DaveE


Hey there Dave :smile: I am kind of bad at this...what is the part on bold doing?
 
It's saying if the value at C[mx] (the mxth value in the single-dimensional matrix C) is equal to 1, then execute the code that's in the following set of braces. The first line in that sub-block of code says to set ry equal to 0.

I should note that actually, there's a little confusion there in terms of indexing. If your arrays are 0-based, then you want:

Code:
rx = 0
ry = 0
for(mx = 0 to M-1) {
    if(C[mx] == 1) {
        ry = 0
        for(my = 0 to M-1) {
            if(C[my] == 1) {
                R[rx][ry] = M[mx][my]
                ry++
            }
        }
        rx++
    }
}

And if your arrays are 1-based, then you want:

Code:
rx = 1
ry = 1
for(mx = 1 to M) {
    if(C[mx] == 1) {
        ry = 1
        for(my = 1 to M) {
            if(C[my] == 1) {
                R[rx][ry] = M[mx][my]
                ry++
            }
        }
        rx++
    }
}

DaveE
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 25 ·
Replies
25
Views
3K
  • · Replies 9 ·
Replies
9
Views
2K
Replies
3
Views
2K
Replies
31
Views
4K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 8 ·
Replies
8
Views
1K
  • · Replies 4 ·
Replies
4
Views
3K