This works:
SparseArray[{{1, 1} -> 1, {2, 2} -> 2}]\
(* {{1, 0}, {0, 2}} *)
This works:
SparseArray[{{1, 1}, {1, 2}} -> 1]
(* {{1, 1}} *)
But it seems a combination of this kind of syntax for rules does not, or at least not as I expect it to:
SparseArray[{{{1, 1}, {1, 2}} -> 1, {2, 2} -> 2}]
(* {{0, 0}, {0, 2}} *)
I expected to get
(* {{1, 1}, {0, 2}} *)
which I could obtain by splitting up the positions to be assigned to 1
using
SparseArray[{{1, 1} -> 1, {1, 2} -> 1, {2, 2} -> 2}]
(* {{1, 1}, {0, 2}} *)
but this gets unwieldy if I want to accomplish this for many more points.
Is there something I'm misunderstanding about SparseArray
? As near as I can tell, there's nothing in the documentation that explains what's going on here.
Edit: Adding some details about what I plan on doing with this. I'm building an 18x18 array where the entry in the $i$th row and $j$th column represents the "effectiveness" $a_{i,j}$ of a factor $i$ on another factor $j$. Effectiveness is defined by $$a_{i,j}=\begin{cases}2&\text{if very effective}\\1&\text{if neutrally effective}\\\frac{1}{2}&\text{if not very effective}\\0&\text{if completely ineffective}\end{cases}$$ Once created, I was planning on generating a sort of "weighted" graph with this array as the adjacency matrix where the value of $a_{i,j}$ determines the style (say, color or thickness or opacity) of the edge connecting node $i$ to node $j$; essentially a visual representation of the effect $i$ has on $j$. This process is outside the immediate scope of the current question and something I'd like to look into on my own until I run into trouble.
For a concrete example, I'll construct the first row of the array using ciao's suggestion with Alternatives
. The $i=1$ factor has effectiveness
$$a_{1,j}=\begin{cases}2&\text{if }j\in\{2,10,15\}\\1&\text{if }j\in\{1,3,4,11,12,13,16,18\}\\\frac{1}{2}&\text{if }j\in\{5,6,7,8,9,14,17\}\\0&\text{never}\end{cases}$$
Denoting the effectiveness intensities by
very = {2, 10, 15};
neutral = {1, (*...*), 18};
not = {5, (*...*), 17};
I can generate the first row with
SparseArray[
{
{1, Alternatives@@very} -> 2,
{1, Alternatives@@neutral} -> 1,
{1, Alternatives@@not} -> 1/2
}, {1, 18}
]
letting SparseArray
handle the case where $i$ doesn't affect $j$ at all. I was getting an error message about the dimension being undetermined, so I tacked on the {1, 18}
at the end to make sure I get an appropriately sized array.
SparseArray[{Thread[{{1, 1}, {1, 2}} -> 1], {2, 2} -> 2} // Flatten]
$\endgroup$Alternatives
is your friend here... $\endgroup$SparseArray[{{1, 1 | 2} -> 1, {2, 2} -> 2}]
$\endgroup$SparseArray[{{{1, 1}, {1, 2}} -> {1, 1}, {2, 2} -> 2}]
- personally, I find patterns/alternatives more transparent. It would be nice if you could expand on "...many more points" with a clear example of your problem. $\endgroup$Alternatives@@very
, etc... $\endgroup$